[gcc/devel/omp/gcc-10] tree-optimization/95133 - avoid abnormal edges in path splitting

Tobias Burnus burnus@gcc.gnu.org
Tue Jul 14 10:49:03 GMT 2020


https://gcc.gnu.org/g:1d93c1bdbb1fb59e56f115601c792fa539e8deb5

commit 1d93c1bdbb1fb59e56f115601c792fa539e8deb5
Author: Richard Biener <rguenther@suse.de>
Date:   Fri May 15 09:38:54 2020 +0200

    tree-optimization/95133 - avoid abnormal edges in path splitting
    
    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.

Diff:
---
 gcc/gimple-ssa-split-paths.c   | 10 ++++++++--
 gcc/testsuite/gcc.dg/pr95133.c | 14 ++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/gcc/gimple-ssa-split-paths.c b/gcc/gimple-ssa-split-paths.c
index 1a56868f6a3..b3efd43c7ef 100644
--- a/gcc/gimple-ssa-split-paths.c
+++ b/gcc/gimple-ssa-split-paths.c
@@ -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.  */
diff --git a/gcc/testsuite/gcc.dg/pr95133.c b/gcc/testsuite/gcc.dg/pr95133.c
new file mode 100644
index 00000000000..523decaf90e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr95133.c
@@ -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);
+}


More information about the Gcc-cvs mailing list