OSDN Git Service

2012-05-22 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2012 10:46:21 +0000 (10:46 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2012 10:46:21 +0000 (10:46 +0000)
PR tree-optimization/53408
* tree-vect-loop.c (vectorizable_induction): Properly check
the restriction that we cannot handle induction results from
the inner loop outside of the outer loop.

* gcc.dg/torture/pr53408.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@187770 138bc75d-0d04-0410-961f-82ee72b054a4

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

index dbf7a44..61f8bbf 100644 (file)
@@ -1,3 +1,10 @@
+2012-05-22  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/53408
+       * tree-vect-loop.c (vectorizable_induction): Properly check
+       the restriction that we cannot handle induction results from
+       the inner loop outside of the outer loop.
+
 2012-05-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/53436
index 05aec61..3c680d2 100644 (file)
@@ -1,5 +1,10 @@
 2012-05-22  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/53408
+       * gcc.dg/torture/pr53408.c: New testcase.
+
+2012-05-22  Richard Guenther  <rguenther@suse.de>
+
        PR middle-end/51071
        * gcc.dg/torture/pr51071-2.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/torture/pr53408.c b/gcc/testsuite/gcc.dg/torture/pr53408.c
new file mode 100644 (file)
index 0000000..25c6dc7
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int a, b, c, d, e;
+void
+fn1 ()
+{
+  int f, g;
+  char h = 0;
+  b = 0;
+  for (; b < 32; b++)
+    {
+      g = h > e ? h : h << 1;
+      f = g && a ? 0 : 1;
+      h = 1;
+      for (; h > 0; h = h + 1)
+       c = 0 < h | f;
+    }
+  if (h)
+    d = 0;
+}
index 65dec89..978442d 100644 (file)
@@ -5050,12 +5050,46 @@ vectorizable_induction (gimple phi, gimple_stmt_iterator *gsi ATTRIBUTE_UNUSED,
   tree vec_def;
 
   gcc_assert (ncopies >= 1);
-  /* FORNOW. This restriction should be relaxed.  */
-  if (nested_in_vect_loop_p (loop, phi) && ncopies > 1)
+  /* FORNOW. These restrictions should be relaxed.  */
+  if (nested_in_vect_loop_p (loop, phi))
     {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        fprintf (vect_dump, "multiple types in nested loop.");
-      return false;
+      imm_use_iterator imm_iter;
+      use_operand_p use_p;
+      gimple exit_phi;
+      edge latch_e;
+      tree loop_arg;
+
+      if (ncopies > 1)
+       {
+         if (vect_print_dump_info (REPORT_DETAILS))
+           fprintf (vect_dump, "multiple types in nested loop.");
+         return false;
+       }
+
+      exit_phi = NULL;
+      latch_e = loop_latch_edge (loop->inner);
+      loop_arg = PHI_ARG_DEF_FROM_EDGE (phi, latch_e);
+      FOR_EACH_IMM_USE_FAST (use_p, imm_iter, loop_arg)
+       {
+         if (!flow_bb_inside_loop_p (loop->inner,
+                                     gimple_bb (USE_STMT (use_p))))
+           {
+             exit_phi = USE_STMT (use_p);
+             break;
+           }
+       }
+      if (exit_phi)
+       {
+         stmt_vec_info exit_phi_vinfo  = vinfo_for_stmt (exit_phi);
+         if (!(STMT_VINFO_RELEVANT_P (exit_phi_vinfo)
+               && !STMT_VINFO_LIVE_P (exit_phi_vinfo)))
+           {
+             if (vect_print_dump_info (REPORT_DETAILS))
+               fprintf (vect_dump, "inner-loop induction only used outside "
+                        "of the outer vectorized loop.");
+             return false;
+           }
+       }
     }
 
   if (!STMT_VINFO_RELEVANT_P (stmt_info))