diff mbox

RFA: Tighten vector aliasing check

Message ID g4hb6qe97o.fsf@googlemail.com
State New
Headers show

Commit Message

Richard Sandiford July 13, 2011, 11 a.m. UTC
tree-vect-loop-manip.c assumes there is an alias if:

     ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
     || (load_ptr_0 + load_segment_length_0) < store_ptr_0))

which means that contiguous arrays are unnecessarily considered to alias.

This patch changes the "<" to "<=".  Tested on x86_64-linux-gnu
(all languages).  OK to install?

Richard


gcc/
	* tree-vect-loop-manip.c (vect_create_cond_for_alias_checks): Tighten
	overlap check.

Comments

Richard Biener July 13, 2011, 11:09 a.m. UTC | #1
On Wed, Jul 13, 2011 at 1:00 PM, Richard Sandiford
<rdsandiford@googlemail.com> wrote:
> tree-vect-loop-manip.c assumes there is an alias if:
>
>     ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
>     || (load_ptr_0 + load_segment_length_0) < store_ptr_0))
>
> which means that contiguous arrays are unnecessarily considered to alias.
>
> This patch changes the "<" to "<=".  Tested on x86_64-linux-gnu
> (all languages).  OK to install?

Ok.

Thanks,
Richard.

> Richard
>
>
> gcc/
>        * tree-vect-loop-manip.c (vect_create_cond_for_alias_checks): Tighten
>        overlap check.
>
> Index: gcc/tree-vect-loop-manip.c
> ===================================================================
> --- gcc/tree-vect-loop-manip.c  2011-06-22 16:46:34.000000000 +0100
> +++ gcc/tree-vect-loop-manip.c  2011-07-13 11:12:06.000000000 +0100
> @@ -2409,13 +2409,13 @@ vect_create_cond_for_alias_checks (loop_
>   tree part_cond_expr, length_factor;
>
>   /* Create expression
> -     ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
> -     || (load_ptr_0 + load_segment_length_0) < store_ptr_0))
> +     ((store_ptr_0 + store_segment_length_0) <= load_ptr_0)
> +     || (load_ptr_0 + load_segment_length_0) <= store_ptr_0))
>      &&
>      ...
>      &&
> -     ((store_ptr_n + store_segment_length_n) < load_ptr_n)
> -     || (load_ptr_n + load_segment_length_n) < store_ptr_n))  */
> +     ((store_ptr_n + store_segment_length_n) <= load_ptr_n)
> +     || (load_ptr_n + load_segment_length_n) <= store_ptr_n))  */
>
>   if (VEC_empty (ddr_p, may_alias_ddrs))
>     return;
> @@ -2484,8 +2484,8 @@ vect_create_cond_for_alias_checks (loop_
>
>       part_cond_expr =
>        fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
> -         fold_build2 (LT_EXPR, boolean_type_node, seg_a_max, seg_b_min),
> -         fold_build2 (LT_EXPR, boolean_type_node, seg_b_max, seg_a_min));
> +         fold_build2 (LE_EXPR, boolean_type_node, seg_a_max, seg_b_min),
> +         fold_build2 (LE_EXPR, boolean_type_node, seg_b_max, seg_a_min));
>
>       if (*cond_expr)
>        *cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
>
Richard Sandiford July 13, 2011, 11:11 a.m. UTC | #2
Richard Sandiford <rdsandiford@googlemail.com> writes:
> tree-vect-loop-manip.c assumes there is an alias if:

I meant _unless_.

>      ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
>      || (load_ptr_0 + load_segment_length_0) < store_ptr_0))
>
> which means that contiguous arrays are unnecessarily considered to alias.

Richard
diff mbox

Patch

Index: gcc/tree-vect-loop-manip.c
===================================================================
--- gcc/tree-vect-loop-manip.c	2011-06-22 16:46:34.000000000 +0100
+++ gcc/tree-vect-loop-manip.c	2011-07-13 11:12:06.000000000 +0100
@@ -2409,13 +2409,13 @@  vect_create_cond_for_alias_checks (loop_
   tree part_cond_expr, length_factor;
 
   /* Create expression
-     ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
-     || (load_ptr_0 + load_segment_length_0) < store_ptr_0))
+     ((store_ptr_0 + store_segment_length_0) <= load_ptr_0)
+     || (load_ptr_0 + load_segment_length_0) <= store_ptr_0))
      &&
      ...
      &&
-     ((store_ptr_n + store_segment_length_n) < load_ptr_n)
-     || (load_ptr_n + load_segment_length_n) < store_ptr_n))  */
+     ((store_ptr_n + store_segment_length_n) <= load_ptr_n)
+     || (load_ptr_n + load_segment_length_n) <= store_ptr_n))  */
 
   if (VEC_empty (ddr_p, may_alias_ddrs))
     return;
@@ -2484,8 +2484,8 @@  vect_create_cond_for_alias_checks (loop_
 
       part_cond_expr =
       	fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
-	  fold_build2 (LT_EXPR, boolean_type_node, seg_a_max, seg_b_min),
-	  fold_build2 (LT_EXPR, boolean_type_node, seg_b_max, seg_a_min));
+	  fold_build2 (LE_EXPR, boolean_type_node, seg_a_max, seg_b_min),
+	  fold_build2 (LE_EXPR, boolean_type_node, seg_b_max, seg_a_min));
 
       if (*cond_expr)
 	*cond_expr = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,