re PR tree-optimization/81510 (ice in operator[], at vec.h:749)
authorRichard Biener <rguenther@suse.de>
Tue, 25 Jul 2017 11:02:32 +0000 (11:02 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 25 Jul 2017 11:02:32 +0000 (11:02 +0000)
2017-07-25  Richard Biener  <rguenther@suse.de>

PR tree-optimization/81510
* tree-vect-loop.c (vect_is_simple_reduction): When the
reduction stmt is not inside the loop bail out.

* gcc.dg/torture/pr81510.c: New testcase.
* gcc.dg/torture/pr81510-2.c: Likewise.

From-SVN: r250504

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

index 82c7edc595d92b95dd13a02ed90263d592d542e8..880b10e2955cd0b400f22d1540d3092597a1e0ef 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81510
+       * tree-vect-loop.c (vect_is_simple_reduction): When the
+       reduction stmt is not inside the loop bail out.
+
 2017-07-25  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81303
index 2762ae5b70f160eebd51581786b18a6a187a47d3..f75186947ad3e2a1fe2168eab3723817dcb0d8a4 100644 (file)
@@ -1,3 +1,9 @@
+2017-07-25  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/81510
+       * gcc.dg/torture/pr81510.c: New testcase.
+       * gcc.dg/torture/pr81510-2.c: Likewise.
+
 2017-07-25  Martin Liska  <mliska@suse.cz>
 
        PR ipa/81520
diff --git a/gcc/testsuite/gcc.dg/torture/pr81510-2.c b/gcc/testsuite/gcc.dg/torture/pr81510-2.c
new file mode 100644 (file)
index 0000000..7e2bc98
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+typedef int h;
+typedef int k;
+int a;
+int b;
+int c;
+int d;
+int e;
+int f(int g)
+{
+  h *i = &e;
+  k *j;
+  if (d -= b)
+    for (; *j; *j += 1) {
+       g = g || (a = e ? c = (__UINTPTR_TYPE__)j : 0) + *i;
+       i = &d;
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr81510.c b/gcc/testsuite/gcc.dg/torture/pr81510.c
new file mode 100644 (file)
index 0000000..c93c468
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-w" } */
+
+typedef int d;
+typedef int f;
+typedef long h;
+int a;
+int b;
+int c;
+int e()
+{
+  f *g;
+  h i;
+  for (;;)
+    if (g)
+      for (; b; b++) {
+         g = c;
+         if (a &= c) {
+             d *j = &b;
+             h k;
+             for (; i; i++) {
+                 *g ?: (*j = k);
+                 g = &a;
+             }
+             for (; i <= 3; i++)
+               ;
+         }
+      }
+}
index 931f1b5872e6820b5b85d4e9c1ef9c5b9b8b2e5d..5b1b8a1fdee321e2550a64c41bd4519552575935 100644 (file)
@@ -2813,27 +2813,29 @@ vect_is_simple_reduction (loop_vec_info loop_info, gimple *phi,
       return NULL;
     }
 
+  if (! flow_bb_inside_loop_p (loop, gimple_bb (def_stmt)))
+    return NULL;
+
   nloop_uses = 0;
   auto_vec<gphi *, 3> lcphis;
-  if (flow_bb_inside_loop_p (loop, gimple_bb (def_stmt)))
-    FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
-      {
-       gimple *use_stmt = USE_STMT (use_p);
-       if (is_gimple_debug (use_stmt))
-         continue;
-       if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
-         nloop_uses++;
-       else
-         /* We can have more than one loop-closed PHI.  */
-         lcphis.safe_push (as_a <gphi *> (use_stmt));
-       if (nloop_uses > 1)
-         {
-           if (dump_enabled_p ())
-             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                              "reduction used in loop.\n");
-           return NULL;
-         }
-      }
+  FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
+    {
+      gimple *use_stmt = USE_STMT (use_p);
+      if (is_gimple_debug (use_stmt))
+       continue;
+      if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
+       nloop_uses++;
+      else
+       /* We can have more than one loop-closed PHI.  */
+       lcphis.safe_push (as_a <gphi *> (use_stmt));
+      if (nloop_uses > 1)
+       {
+         if (dump_enabled_p ())
+           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                            "reduction used in loop.\n");
+         return NULL;
+       }
+    }
 
   /* If DEF_STMT is a phi node itself, we expect it to have a single argument
      defined in the inner loop.  */