]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: [multiple changes]
authorRichard Guenther <rguenther@suse.de>
Tue, 3 Jan 2012 13:07:57 +0000 (13:07 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 3 Jan 2012 13:07:57 +0000 (13:07 +0000)
2011-05-18  Richard Guenther  <rguenther@suse.de>

Backport from mainline
2011-05-12  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48172
* tree-vect-loop-manip.c (vect_vfa_segment_size): Do not exclude
the number of iterations from the segment size calculation.
(vect_create_cond_for_alias_checks): Adjust.

2011-05-13  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/48172
* tree-vect-loop-manip.c (vect_vfa_segment_size): Avoid
multiplying by number of iterations for equal step.
(vect_create_cond_for_alias_checks): Likewise.

* gcc.dg/vect/pr48172.c: New testcase.

From-SVN: r182841

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr48172.c [new file with mode: 0644]
gcc/tree-vect-loop-manip.c

index 207be0da6819c7d90e415baffd50ac2a55d5f024..c06a728ce337f4a11d73f1641c807d2f3d840f07 100644 (file)
@@ -1,3 +1,20 @@
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
+       2011-05-12  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48172
+       * tree-vect-loop-manip.c (vect_vfa_segment_size): Do not exclude
+       the number of iterations from the segment size calculation.
+       (vect_create_cond_for_alias_checks): Adjust.
+
+       2011-05-13  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48172
+       * tree-vect-loop-manip.c (vect_vfa_segment_size): Avoid
+       multiplying by number of iterations for equal step.
+       (vect_create_cond_for_alias_checks): Likewise.
+
 2011-12-21  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 5ed1ab281c99d08674d112a4ee186e6cc8bf7035..25e5c8299ce0dffff2f4a3ee4294969b330abc63 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
+       2011-05-12  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/48172
+       * gcc.dg/vect/pr48172.c: New testcase.
+
 2011-12-20  Dodji Seketeli  <dodji@redhat.com>
 
        PR debug/49951
diff --git a/gcc/testsuite/gcc.dg/vect/pr48172.c b/gcc/testsuite/gcc.dg/vect/pr48172.c
new file mode 100644 (file)
index 0000000..892aeca
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+
+extern void *memset(void *s, int c, __SIZE_TYPE__ n);
+extern void abort (void);
+
+#define ASIZE 1028
+#define HALF (ASIZE/2)
+
+int main() {
+  unsigned int array[ASIZE];
+  int i;
+
+  memset(array, 0, sizeof(array));
+
+  /* initialize first half of the array */
+  for (i = 0; i < HALF; i++)
+    array[i] = i;
+
+  /* fill second half of array in by summing earlier elements of the array
+     gcc 4.5.1 and 4.5.2 incorrectly vectorize this loop!  aray[1025] is left
+     at 0 for ASIZE=1028 */
+  for (i = 0; i < HALF-1; i++)
+    array[HALF+i] = array[2*i] + array[2*i + 1];
+
+  /* see if we have any failures */
+  for (i = 0; i < HALF - 1; i++)
+    if (array[HALF+i] != array[2*i] + array[2*i + 1])
+      abort ();
+
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
index 568e640f601b4b8de9599f9295c79f45daf1512c..7aa4cbfd6f1b8f681450efec50262679e0b93505 100644 (file)
@@ -2342,26 +2342,26 @@ vect_create_cond_for_align_checks (loop_vec_info loop_vinfo,
 
    Input:
      DR: The data reference.
-     VECT_FACTOR: vectorization factor.
+     LENGTH_FACTOR: segment length to consider.
 
    Return an expression whose value is the size of segment which will be
    accessed by DR.  */
 
 static tree
-vect_vfa_segment_size (struct data_reference *dr, tree vect_factor)
+vect_vfa_segment_size (struct data_reference *dr, tree length_factor)
 {
-  tree segment_length = fold_build2 (MULT_EXPR, integer_type_node,
-                                    DR_STEP (dr), vect_factor);
-
+  tree segment_length;
+  segment_length = size_binop (MULT_EXPR,
+                              fold_convert (sizetype, DR_STEP (dr)),
+                              fold_convert (sizetype, length_factor));
   if (vect_supportable_dr_alignment (dr) == dr_explicit_realign_optimized)
     {
       tree vector_size = TYPE_SIZE_UNIT
                          (STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr))));
 
-      segment_length = fold_build2 (PLUS_EXPR, integer_type_node,
-                                   segment_length, vector_size);
+      segment_length = size_binop (PLUS_EXPR, segment_length, vector_size);
     }
-  return fold_convert (sizetype, segment_length);
+  return segment_length;
 }
 
 
@@ -2395,12 +2395,12 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo,
   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
   VEC (ddr_p, heap) * may_alias_ddrs =
     LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo);
-  tree vect_factor =
-    build_int_cst (integer_type_node, LOOP_VINFO_VECT_FACTOR (loop_vinfo));
+  int vect_factor = LOOP_VINFO_VECT_FACTOR (loop_vinfo);
+  tree scalar_loop_iters = LOOP_VINFO_NITERS (loop_vinfo);
 
   ddr_p ddr;
   unsigned int i;
-  tree part_cond_expr;
+  tree part_cond_expr, length_factor;
 
   /* Create expression
      ((store_ptr_0 + store_segment_length_0) < load_ptr_0)
@@ -2447,8 +2447,12 @@ vect_create_cond_for_alias_checks (loop_vec_info loop_vinfo,
         vect_create_addr_base_for_vector_ref (stmt_b, cond_expr_stmt_list,
                                              NULL_TREE, loop);
 
-      segment_length_a = vect_vfa_segment_size (dr_a, vect_factor);
-      segment_length_b = vect_vfa_segment_size (dr_b, vect_factor);
+      if (!operand_equal_p (DR_STEP (dr_a), DR_STEP (dr_b), 0))
+       length_factor = scalar_loop_iters;
+      else
+       length_factor = size_int (vect_factor);
+      segment_length_a = vect_vfa_segment_size (dr_a, length_factor);
+      segment_length_b = vect_vfa_segment_size (dr_b, length_factor);
 
       if (vect_print_dump_info (REPORT_DR_DETAILS))
        {