re PR middle-end/78445 (ICE in maybe_gen_insn, at optabs.c:7014)
authorJakub Jelinek <jakub@redhat.com>
Tue, 22 Nov 2016 10:13:01 +0000 (11:13 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 22 Nov 2016 10:13:01 +0000 (11:13 +0100)
PR tree-optimization/78445
* tree-if-conv.c (tree_if_conversion): If any_pred_load_store or
any_complicated_phi, version loop even if flag_tree_loop_if_convert is
1.  Formatting fix.

* gcc.dg/pr78445.c: New test.

From-SVN: r242689

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr78445.c [new file with mode: 0644]
gcc/tree-if-conv.c

index b8fb5feb289ea03400112e5223188d4c60bed11c..c97934882eb2b631cd0ca7981ffbadf1595e422a 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/78445
+       * tree-if-conv.c (tree_if_conversion): If any_pred_load_store or
+       any_complicated_phi, version loop even if flag_tree_loop_if_convert is
+       1.  Formatting fix.
+
 2016-11-22  Martin Liska  <mliska@suse.cz>
 
        PR ipa/78309
index 8bba3896ab31f113414cca9239d6f4445932c9b0..125b01f281719cd9ef990e43c65d0d7cbf97e9e5 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/78445
+       * gcc.dg/pr78445.c: New test.
+
 2016-11-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        PR libgfortran/78449 
diff --git a/gcc/testsuite/gcc.dg/pr78445.c b/gcc/testsuite/gcc.dg/pr78445.c
new file mode 100644 (file)
index 0000000..bb5327b
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR tree-optimization/78445 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-if-convert -ftree-vectorize" } */
+/* { dg-additional-options "-mavx2" { target { i?86-*-* x86_64-*-* } } } */
+
+int a;
+
+void
+foo (int x, int *y)
+{
+  while (a != 0)
+    if (x != 0)
+      {
+       *y = a;
+       x = *y;
+      }
+    else
+      x = a;
+}
index dc43d950cf11fa94aa05ba9a567e248c5e10b959..13e12c63e1eae74738924cba35d3a7b3d3a393db 100644 (file)
@@ -2808,15 +2808,20 @@ tree_if_conversion (struct loop *loop)
     goto cleanup;
 
   /* Since we have no cost model, always version loops unless the user
-     specified -ftree-loop-if-convert.  Either version this loop, or if
-     the pattern is right for outer-loop vectorization, version the
-     outer loop.  In the latter case we will still if-convert the
-     original inner loop.  */
-  if (flag_tree_loop_if_convert != 1
-      && !version_loop_for_if_conversion
-      (versionable_outer_loop_p (loop_outer (loop))
-       ? loop_outer (loop) : loop))
-    goto cleanup;
+     specified -ftree-loop-if-convert or unless versioning is required.
+     Either version this loop, or if the pattern is right for outer-loop
+     vectorization, version the outer loop.  In the latter case we will
+     still if-convert the original inner loop.  */
+  if (any_pred_load_store
+      || any_complicated_phi
+      || flag_tree_loop_if_convert != 1)
+    {
+      struct loop *vloop
+       = (versionable_outer_loop_p (loop_outer (loop))
+          ? loop_outer (loop) : loop);
+      if (!version_loop_for_if_conversion (vloop))
+       goto cleanup;
+    }
 
   /* Now all statements are if-convertible.  Combine all the basic
      blocks into one huge basic block doing the if-conversion