tree-optimization/95133 - avoid abnormal edges in path splitting
authorRichard Biener <rguenther@suse.de>
Fri, 15 May 2020 07:38:54 +0000 (09:38 +0200)
committerRichard Biener <rguenther@suse.de>
Fri, 15 May 2020 10:11:37 +0000 (12:11 +0200)
When path splitting tries to detect a CFG diamond make sure it
is composed of normal (non-EH, not abnormal) edges.  Otherwise
CFG manipulation later may fail.

2020-05-15  Richard Biener  <rguenther@suse.de>

PR tree-optimization/95133
* gimple-ssa-split-paths.c
(find_block_to_duplicate_for_splitting_paths): Check for
normal edges.

* gcc.dg/pr95133.c: New testcase.

gcc/ChangeLog
gcc/gimple-ssa-split-paths.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr95133.c [new file with mode: 0644]

index fb7ee99fa28f9313645711d3ebe0afbaed4c9fb3..b66cb8a477bd517f7df155fb63d9e55b794b81ea 100644 (file)
@@ -1,3 +1,10 @@
+2020-05-15  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/95133
+       * gimple-ssa-split-paths.c
+       (find_block_to_duplicate_for_splitting_paths): Check for
+       normal edges.
+
 2020-05-15  Christophe Lyon  <christophe.lyon@linaro.org>
 
         * config/arm/arm.c (reg_needs_saving_p): Add support for interrupt
index 1a56868f6a36e4053eafa30bf6d53035011221df..b3efd43c7efe504a98e7d1d8d76304722d0e0006 100644 (file)
@@ -67,8 +67,14 @@ find_block_to_duplicate_for_splitting_paths (basic_block latch)
         region.  Verify that it is.
 
         First, verify that BB has two predecessors (each arm of the
-        IF-THEN-ELSE) and two successors (the latch and exit).  */
-      if (EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (bb->succs) == 2)
+        IF-THEN-ELSE) and two successors (the latch and exit) and that
+        all edges are normal.  */
+      if (EDGE_COUNT (bb->preds) == 2
+         && !(EDGE_PRED (bb, 0)->flags & EDGE_COMPLEX)
+         && !(EDGE_PRED (bb, 1)->flags & EDGE_COMPLEX)
+         && EDGE_COUNT (bb->succs) == 2
+         && !(EDGE_SUCC (bb, 0)->flags & EDGE_COMPLEX)
+         && !(EDGE_SUCC (bb, 1)->flags & EDGE_COMPLEX))
        {
          /* Now verify that BB's immediate dominator ends in a
             conditional as well.  */
index 6b8b52dae2ec4e099e1158799a7a0d1f8711cf5b..0398bf23891da462c5fa92fabf8116bf4a99a325 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-15  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/95133
+       * gcc.dg/pr95133.c: New testcase.
+
 2020-05-15  Tobias Burnus  <tobias@codesourcery.com>
 
        PR middle-end/94635
diff --git a/gcc/testsuite/gcc.dg/pr95133.c b/gcc/testsuite/gcc.dg/pr95133.c
new file mode 100644 (file)
index 0000000..523deca
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+extern int a[16];
+void f (int *ip, int x)
+{
+  int *xp = a;
+  for (int i=0; i<8; ++i)
+  {
+    base: if (x) return;
+  }
+  *xp++ = *ip;
+  goto *(&&base + *ip);
+}