aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr80707.C29
-rw-r--r--gcc/tree-cfg.c4
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4339e57..197c75b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 82cd82d..28664c7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..4fe8933
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr80707.C
@@ -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--;
+ }
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 77cb3d6..72c5284 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -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--;