re PR middle-end/80707 (r247844 causes error: extra outgoing edge)
authorPeter Bergner <bergner@vnet.ibm.com>
Fri, 12 May 2017 17:13:07 +0000 (12:13 -0500)
committerPeter Bergner <bergner@gcc.gnu.org>
Fri, 12 May 2017 17:13:07 +0000 (12:13 -0500)
gcc/
PR middle-end/80707
* tree-cfg.c: Remove cfg edges of unreachable case statements.

gcc/testsuite/
PR middle-end/80707
* g++.dg/pr80707.C: New test.

From-SVN: r247984

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr80707.C [new file with mode: 0644]
gcc/tree-cfg.c

index 4339e570b6eb52fd1239797a4f3bbd2c5e459d2b..197c75b1ace4ed22ec16439854a79e6e8f5dabdb 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-12  Peter Bergner  <bergner@vnet.ibm.com>
+
+       PR middle-end/80707
+       * tree-cfg.c: Remove cfg edges of unreachable case statements.
+
 2017-05-12  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * config/rs6000/rs6000.c (rs6000_gimple_fold_builtin): Add handling for
index 82cd82d52f05e8c202fb4fea8762d06197482497..28664c78cdb17799f20d4f0a86141d68c1f9f967 100644 (file)
@@ -1,3 +1,8 @@
+2017-05-12  Peter Bergner  <bergner@vnet.ibm.com>
+
+       PR middle-end/80707
+       * g++.dg/pr80707.C: New test.
+
 2017-05-12  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * gcc.target/powerpc/fold-vec-div-float.c: New.
diff --git a/gcc/testsuite/g++.dg/pr80707.C b/gcc/testsuite/g++.dg/pr80707.C
new file mode 100644 (file)
index 0000000..4fe8933
--- /dev/null
@@ -0,0 +1,29 @@
+// PR middle-end/80707 ICE: extra outgoing edge causes verify_flow_info error.
+// { dg-do compile }
+// { dg-options "-O3" } */
+
+struct A {
+  int m_fn1(int &) const;
+};
+int A::m_fn1(int &p1) const {
+  int a[6];
+  int b = 0;
+  for (int i;; i++) {
+    if (a[i])
+      break;
+    b++;
+  }
+  while (b) {
+    int c;
+    switch (b) {
+    case 1:
+      c = 0;
+      break;
+    case 5:
+      c = a[0];
+    }
+    if (c)
+      p1 = 0;
+    b--;
+  }
+}
index 77cb3d62368637d15d624f39e015b90255532e8d..72c52840cd4c1eccb8b884bda34328fb57daa3a2 100644 (file)
@@ -1684,6 +1684,10 @@ group_case_labels_stmt (gswitch *stmt)
          || (EDGE_COUNT (base_bb->succs) == 0
              && gimple_seq_unreachable_p (bb_seq (base_bb))))
        {
+         edge e;
+         if (base_bb != default_bb
+             && (e = find_edge (gimple_bb (stmt), base_bb)) != NULL)
+           remove_edge_and_dominated_blocks (e);
          gimple_switch_set_label (stmt, i, NULL_TREE);
          i++;
          new_size--;