re PR tree-optimization/87895 (ICE in purge_dead_edges, at cfgrtl.c:3246)
authorJakub Jelinek <jakub@redhat.com>
Tue, 20 Nov 2018 20:44:38 +0000 (21:44 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 20 Nov 2018 20:44:38 +0000 (21:44 +0100)
PR tree-optimization/87895
* omp-simd-clone.c (ipa_simd_modify_function_body): When removing
or replacing GIMPLE_RETURN, set EDGE_FALLTHRU on the edge to EXIT.
(simd_clone_adjust): Don't set EDGE_FALLTHRU here. In a loop that
redirects edges to EXIT to edges to incr_bb, iterate while EXIT
has any preds and always use EDGE_PRED (, 0).

* gcc.dg/gomp/pr87895-1.c: New test.
* gcc.dg/gomp/pr87895-2.c: New test.
* gcc.dg/gomp/pr87895-3.c: New test.

From-SVN: r266328

gcc/ChangeLog
gcc/omp-simd-clone.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/pr87895-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr87895-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/gomp/pr87895-3.c [new file with mode: 0644]

index 2ee021c62c330dbb373c38075e94b1757f7797fd..aece55980f0bf986ae6f76ffb42fa6af1fdc232d 100644 (file)
@@ -1,3 +1,12 @@
+2018-11-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/87895
+       * omp-simd-clone.c (ipa_simd_modify_function_body): When removing
+       or replacing GIMPLE_RETURN, set EDGE_FALLTHRU on the edge to EXIT.
+       (simd_clone_adjust): Don't set EDGE_FALLTHRU here. In a loop that
+       redirects edges to EXIT to edges to incr_bb, iterate while EXIT
+       has any preds and always use EDGE_PRED (, 0).
+
 2018-11-20  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/88070
index 7aa362a5e70e1ff151e6c69ebdb14fbaa05ea042..ba03bd50fe69906778457a7227fdee9f6e1b1f4c 100644 (file)
@@ -994,6 +994,8 @@ ipa_simd_modify_function_body (struct cgraph_node *node,
          if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
            {
              tree retval = gimple_return_retval (return_stmt);
+             edge e = find_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun));
+             e->flags |= EDGE_FALLTHRU;
              if (!retval)
                {
                  gsi_remove (&gsi, true);
@@ -1150,14 +1152,9 @@ simd_clone_adjust (struct cgraph_node *node)
       incr_bb = create_empty_bb (orig_exit);
       incr_bb->count = profile_count::zero ();
       add_bb_to_loop (incr_bb, body_bb->loop_father);
-      /* The succ of orig_exit was EXIT_BLOCK_PTR_FOR_FN (cfun), with an empty
-        flag.  Set it now to be a FALLTHRU_EDGE.  */
-      gcc_assert (EDGE_COUNT (orig_exit->succs) == 1);
-      EDGE_SUCC (orig_exit, 0)->flags |= EDGE_FALLTHRU;
-      for (unsigned i = 0;
-          i < EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds); ++i)
+      while (EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
        {
-         edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), i);
+         edge e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), 0);
          redirect_edge_succ (e, incr_bb);
          incr_bb->count += e->count ();
        }
index 1915d92af3b8c38fb15ff92d798cfb84ae60e4e2..b810f93c9e221f8c9700af5350af6e25afffb3d3 100644 (file)
@@ -1,3 +1,10 @@
+2018-11-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/87895
+       * gcc.dg/gomp/pr87895-1.c: New test.
+       * gcc.dg/gomp/pr87895-2.c: New test.
+       * gcc.dg/gomp/pr87895-3.c: New test.
+
 2018-11-20  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/88070
diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-1.c b/gcc/testsuite/gcc.dg/gomp/pr87895-1.c
new file mode 100644 (file)
index 0000000..22f5c69
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR tree-optimization/87895 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O0" } */
+
+#pragma omp declare simd
+int
+foo (int x)
+{
+  if (x == 0)
+    return 0;
+}
+
+#pragma omp declare simd
+int
+bar (int *x, int y)
+{
+  if ((y == 0) ? (*x = 0) : *x)
+    return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-2.c b/gcc/testsuite/gcc.dg/gomp/pr87895-2.c
new file mode 100644 (file)
index 0000000..3d27715
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR tree-optimization/87895 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O1" } */
+
+#include "pr87895-1.c"
diff --git a/gcc/testsuite/gcc.dg/gomp/pr87895-3.c b/gcc/testsuite/gcc.dg/gomp/pr87895-3.c
new file mode 100644 (file)
index 0000000..382ad6d
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/87895 */
+/* { dg-do compile } */
+/* { dg-additional-options "-O2" } */
+
+#pragma omp declare simd
+int foo (int x) __attribute__((noreturn));
+
+#pragma omp declare simd
+int
+bar (int x, int y)
+{
+  if (y == 1)
+    foo (x + 2);
+  if (y == 10)
+    foo (x + 6);
+  if (y != 25)
+    return 4;
+}