diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr81564.c | 21 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 5 |
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; |