aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPeter Bergner <bergner@vnet.ibm.com>2017-05-17 09:05:21 -0500
committerPeter Bergner <bergner@gcc.gnu.org>2017-05-17 09:05:21 -0500
commit9853cb287243f9f3555b0c60a3b0d27998fe23b1 (patch)
tree06f3c9db5f3316035b286c59b6e9f237579201ac /gcc
parentb42cc3ca244ea57d5112638a73e7f83c58202a84 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr80775.c21
-rw-r--r--gcc/tree-cfg.c27
4 files changed, 48 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4668e35..004c7bb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-05-17 Peter Bergner <bergner@vnet.ibm.com>
+
+ PR middle-end/80775
+ * tree-cfg.c: Move deletion of unreachable case statements to after
+ the merging of consecutive case labels.
+
2017-05-17 Thomas Preud'homme <thomas.preudhomme@arm.com>
* config/arm/arm.c (cmse_nonsecure_call_clear_caller_saved): Refer
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 44f5841..8f62adb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-05-17 Peter Bergner <bergner@vnet.ibm.com>
+
+ PR middle-end/80775
+ * gcc.dg/pr80775.c: New test.
+
2017-05-17 Marek Polacek <polacek@redhat.com>
PR sanitizer/80659
diff --git a/gcc/testsuite/gcc.dg/pr80775.c b/gcc/testsuite/gcc.dg/pr80775.c
new file mode 100644
index 0000000..df4d250
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr80775.c
@@ -0,0 +1,21 @@
+/* PR middle-end/80775 ICE: -O3 produces ice in group_case_labels_stmt. */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+typedef struct { short a; } b;
+b c[10];
+int d, e, f, g, h;
+int
+i (void)
+{
+ f = 0;
+ for (; f < e; f++) {
+ switch (g) {
+ case 1:
+ d = 1;
+ case 2:
+ c[2 + f].a = 1;
+ }
+ h += c[f].a;
+ }
+}
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