diff options
author | Peter Bergner <bergner@vnet.ibm.com> | 2017-05-17 09:05:21 -0500 |
---|---|---|
committer | Peter Bergner <bergner@gcc.gnu.org> | 2017-05-17 09:05:21 -0500 |
commit | 9853cb287243f9f3555b0c60a3b0d27998fe23b1 (patch) | |
tree | 06f3c9db5f3316035b286c59b6e9f237579201ac /gcc/tree-cfg.c | |
parent | b42cc3ca244ea57d5112638a73e7f83c58202a84 (diff) | |
download | gcc-9853cb287243f9f3555b0c60a3b0d27998fe23b1.zip gcc-9853cb287243f9f3555b0c60a3b0d27998fe23b1.tar.gz gcc-9853cb287243f9f3555b0c60a3b0d27998fe23b1.tar.bz2 |
re PR middle-end/80775 (-O3 produces ice in group_case_labels_stmt)
gcc/
PR middle-end/80775
* tree-cfg.c: Move deletion of unreachable case statements to after
the merging of consecutive case labels.
gcc/testsuite/
PR middle-end/80775
* gcc.dg/pr80775.c: New test.
From-SVN: r248155
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e046a13..ba19661 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -1661,7 +1661,7 @@ void group_case_labels_stmt (gswitch *stmt) { int old_size = gimple_switch_num_labels (stmt); - int i, j, new_size = old_size; + int i, j, base_index, new_size = old_size; basic_block default_bb = NULL; default_bb = label_to_block (CASE_LABEL (gimple_switch_default_label (stmt))); @@ -1678,16 +1678,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 - or if their destination block is unreachable. */ - if (base_bb == default_bb - || (EDGE_COUNT (base_bb->succs) == 0 - && gimple_seq_unreachable_p (bb_seq (base_bb)))) + /* Discard cases that have the same destination as the default case. */ + if (base_bb == default_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--; @@ -1697,7 +1690,7 @@ group_case_labels_stmt (gswitch *stmt) base_high = CASE_HIGH (base_case) ? CASE_HIGH (base_case) : CASE_LOW (base_case); - i++; + base_index = i++; /* Try to merge case labels. Break out when we reach the end of the label vector or when we cannot merge the next case @@ -1723,6 +1716,18 @@ group_case_labels_stmt (gswitch *stmt) else break; } + + /* Discard cases that have an unreachable destination block. */ + if (EDGE_COUNT (base_bb->succs) == 0 + && gimple_seq_unreachable_p (bb_seq (base_bb))) + { + edge base_edge = find_edge (gimple_bb (stmt), base_bb); + if (base_edge != NULL) + remove_edge_and_dominated_blocks (base_edge); + gimple_switch_set_label (stmt, base_index, NULL_TREE); + new_size--; + i++; + } } /* Compress the case labels in the label vector, and adjust the |