Message ID | g4hb6qe97o.fsf@googlemail.com |
---|---|
State | New |
Headers | show |
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 <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
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,