diff options
author | Peter Bergner <bergner@vnet.ibm.com> | 2017-07-27 09:05:14 -0500 |
---|---|---|
committer | Peter Bergner <bergner@gcc.gnu.org> | 2017-07-27 09:05:14 -0500 |
commit | 27c8b49bfc23b658bc8ea90e653f76e26e856c43 (patch) | |
tree | 9d23ea79d7b73f3ad409865e9a94e8ad7bab590c /gcc | |
parent | b7675b592316cd5c2a972cb25c714fe85ec743c1 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-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; |