aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Bergner <bergner@vnet.ibm.com>2017-07-27 09:05:14 -0500
committerPeter Bergner <bergner@gcc.gnu.org>2017-07-27 09:05:14 -0500
commit27c8b49bfc23b658bc8ea90e653f76e26e856c43 (patch)
tree9d23ea79d7b73f3ad409865e9a94e8ad7bab590c
parentb7675b592316cd5c2a972cb25c714fe85ec743c1 (diff)
downloadgcc-27c8b49bfc23b658bc8ea90e653f76e26e856c43.zip
gcc-27c8b49bfc23b658bc8ea90e653f76e26e856c43.tar.gz
gcc-27c8b49bfc23b658bc8ea90e653f76e26e856c43.tar.bz2
re PR middle-end/81564 (ICE in group_case_labels_stmt())
gcc/ PR middle-end/81564 * tree-cfg.c (group_case_labels_stmt): Handle already deleted blocks. gcc/testsuite/ PR middle-end/81564 * gcc.dg/pr81564.c: New test. From-SVN: r250628
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr81564.c21
-rw-r--r--gcc/tree-cfg.c5
4 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 77a77eb..05107fd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-07-27 Peter Bergner <bergner@vnet.ibm.com>
+
+ PR middle-end/81564
+ * tree-cfg.c (group_case_labels_stmt): Handle already deleted blocks.
+
2017-07-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/81573
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fe0b88c..a57caaa 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-07-27 Peter Bergner <bergner@vnet.ibm.com>
+
+ PR middle-end/81564
+ * gcc.dg/pr81564.c: New test.
+
2017-07-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/81573
diff --git a/gcc/testsuite/gcc.dg/pr81564.c b/gcc/testsuite/gcc.dg/pr81564.c
new file mode 100644
index 0000000..1351999
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr81564.c
@@ -0,0 +1,21 @@
+/* PR middle-end/81564 ICE in group_case_labels_stmt(). */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct a {
+ int b;
+ int c;
+};
+
+void
+foo (void)
+{
+ struct a *e;
+ switch (e->c)
+ {
+ case 7:
+ case 3:
+ if (__builtin_expect(!0, 0))
+ __builtin_unreachable();
+ }
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 83e4ee6..f664ffe 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1701,8 +1701,9 @@ group_case_labels_stmt (gswitch *stmt)
gcc_assert (base_case);
base_bb = label_to_block (CASE_LABEL (base_case));
- /* Discard cases that have the same destination as the default case. */
- if (base_bb == default_bb)
+ /* Discard cases that have the same destination as the default case or
+ whose destiniation blocks have already been removed as unreachable. */
+ if (base_bb == NULL || base_bb == default_bb)
{
i++;
continue;