OSDN Git Service

2012-02-20 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Feb 2012 15:15:52 +0000 (15:15 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 20 Feb 2012 15:15:52 +0000 (15:15 +0000)
PR tree-optimization/52298
* tree-vect-stmts.c (vectorizable_store): Properly use
STMT_VINFO_DR_STEP instead of DR_STEP when vectorizing
outer loops.
(vectorizable_load): Likewise.
* tree-vect-data-refs.c (vect_analyze_data_ref_access):
Access DR_STEP after ensuring it is not NULL.

* gcc.dg/torture/pr52298.c: New testcase.
* gcc.dg/vect/pr52298.c: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184396 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr52298.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr52298.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c
gcc/tree-vect-stmts.c

index de00a9d..b8366f4 100644 (file)
@@ -1,3 +1,13 @@
+2012-02-20  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52298
+       * tree-vect-stmts.c (vectorizable_store): Properly use
+       STMT_VINFO_DR_STEP instead of DR_STEP when vectorizing
+       outer loops.
+       (vectorizable_load): Likewise.
+       * tree-vect-data-refs.c (vect_analyze_data_ref_access):
+       Access DR_STEP after ensuring it is not NULL.
+
 2012-02-20  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/52286
index 89d7bb0..caa8eb1 100644 (file)
@@ -1,3 +1,9 @@
+2012-02-20  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52298
+       * gcc.dg/torture/pr52298.c: New testcase.
+       * gcc.dg/vect/pr52298.c: Likewise.
+
 2012-02-20  Georg-Johann Lay  <avr@gjlay.de>
        
        * gcc.dg/pr52132.c: Fix FAIL on 16-bit int platforms.
diff --git a/gcc/testsuite/gcc.dg/torture/pr52298.c b/gcc/testsuite/gcc.dg/torture/pr52298.c
new file mode 100644 (file)
index 0000000..f0799c1
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+int a, b, c, h;
+
+int i[5][5];
+
+void
+fn1 ()
+{
+  int l = 0;
+
+  for (a = 0; a <= 3; a++)
+    for (b = 1; b >= 0; b -= 1)
+      l |= i[0][b];
+  c = l;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr52298.c b/gcc/testsuite/gcc.dg/vect/pr52298.c
new file mode 100644 (file)
index 0000000..c240160
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -ftree-vectorize -fno-tree-pre -fno-tree-loop-im" } */
+
+extern void abort (void);
+int c[80];
+
+__attribute__((noinline)) int
+foo (void)
+{
+  int l = 0;
+  int a, b;
+
+  for (a = 3; a >= 0; a--)
+    for (b = 7; b >= 0; b--)
+      l |= c[a+60];
+  return l;
+}
+
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 60; i++)
+    c[i] = 1;
+  for (; i < 64; i++)
+    c[i] = 1 << (i - 59);
+  if (foo () != 30)
+    abort ();
+  return 0;
+}
+
index 43f7662..b7d0cb5 100644 (file)
@@ -2319,7 +2319,7 @@ vect_analyze_data_ref_access (struct data_reference *dr)
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
   loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
   struct loop *loop = NULL;
-  HOST_WIDE_INT dr_step = TREE_INT_CST_LOW (step);
+  HOST_WIDE_INT dr_step;
 
   if (loop_vinfo)
     loop = LOOP_VINFO_LOOP (loop_vinfo);
@@ -2332,6 +2332,7 @@ vect_analyze_data_ref_access (struct data_reference *dr)
     }
 
   /* Allow invariant loads in loops.  */
+  dr_step = TREE_INT_CST_LOW (step);
   if (loop_vinfo && dr_step == 0)
     {
       GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)) = NULL;
index 20f10f3..f0b3dae 100644 (file)
@@ -3753,7 +3753,9 @@ vectorizable_store (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
   if (!STMT_VINFO_DATA_REF (stmt_info))
     return false;
 
-  if (tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0)
+  if (tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
+                           ? STMT_VINFO_DR_STEP (stmt_info) : DR_STEP (dr),
+                           size_zero_node) < 0)
     {
       if (vect_print_dump_info (REPORT_DETAILS))
         fprintf (vect_dump, "negative step for store.");
@@ -4266,7 +4268,10 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
   if (!STMT_VINFO_DATA_REF (stmt_info))
     return false;
 
-  negative = tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0;
+  negative = tree_int_cst_compare (loop && nested_in_vect_loop_p (loop, stmt)
+                                  ? STMT_VINFO_DR_STEP (stmt_info)
+                                  : DR_STEP (dr),
+                                  size_zero_node) < 0;
   if (negative && ncopies > 1)
     {
       if (vect_print_dump_info (REPORT_DETAILS))
@@ -4654,7 +4659,7 @@ vectorizable_load (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt,
      nested within an outer-loop that is being vectorized.  */
 
   if (loop && nested_in_vect_loop_p (loop, stmt)
-      && (TREE_INT_CST_LOW (DR_STEP (dr))
+      && (TREE_INT_CST_LOW (STMT_VINFO_DR_STEP (stmt_info))
          % GET_MODE_SIZE (TYPE_MODE (vectype)) != 0))
     {
       gcc_assert (alignment_support_scheme != dr_explicit_realign_optimized);