aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2012-07-23 09:26:41 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2012-07-23 09:26:41 +0000
commit25632d2efbf80cb0b5da2fb38081b44f766584de (patch)
treedf7beb4a840ad1542fd80829ec8ac762bde123fe /gcc
parent9696c52909efcdb631f5fd7e8a8261656a25cc1b (diff)
downloadgcc-25632d2efbf80cb0b5da2fb38081b44f766584de.zip
gcc-25632d2efbf80cb0b5da2fb38081b44f766584de.tar.gz
gcc-25632d2efbf80cb0b5da2fb38081b44f766584de.tar.bz2
re PR tree-optimization/53881 (ICE in hoist_edge_and_branch_if_true)
gcc/ PR tree-optimization/53881 * tree-cfg.c (group_case_labels_stmt): Look up the basic block for each label and compare them instead of labels. testsuite/ PR tree-optimization/53881 * gcc.dg/pr53881.c: Renamed to ... * gcc.dg/pr53881-1.c: ... this. * gcc.dg/pr53881-2.c: New test. From-SVN: r189779
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/pr53881-1.c (renamed from gcc/testsuite/gcc.dg/pr53881.c)0
-rw-r--r--gcc/testsuite/gcc.dg/pr53881-2.c19
-rw-r--r--gcc/tree-cfg.c19
5 files changed, 42 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68800a6..5f498e8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-07-22 Steven Bosscher <steven@gcc.gnu.org>
+
+ PR tree-optimization/53881
+ * tree-cfg.c (group_case_labels_stmt): Look up the basic block
+ for each label and compare them instead of labels.
+
2012-07-22 Steven Bosscher <steven@gcc.gnu.org>
* opts.c (common_handle_option): Do not set
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f2bb333..75b8d09 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-07-22 Steven Bosscher <steven@gcc.gnu.org>
+
+ PR tree-optimization/53881
+ * gcc.dg/pr53881.c: Renamed to ...
+ * gcc.dg/pr53881-1.c: ... this.
+ * gcc.dg/pr53881-2.c: New test.
+
2012-07-22 Hans-Peter Nilsson <hp@axis.com>
Handle recent changes in default atomics for cris*-*-linux*.
diff --git a/gcc/testsuite/gcc.dg/pr53881.c b/gcc/testsuite/gcc.dg/pr53881-1.c
index 435d938..435d938 100644
--- a/gcc/testsuite/gcc.dg/pr53881.c
+++ b/gcc/testsuite/gcc.dg/pr53881-1.c
diff --git a/gcc/testsuite/gcc.dg/pr53881-2.c b/gcc/testsuite/gcc.dg/pr53881-2.c
new file mode 100644
index 0000000..f6f8f8b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr53881-2.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int a,b,c;
+void
+fn1 ()
+{
+ switch (a)
+ {
+ case 0:
+ case 10:
+ b=c;
+out_bcon:
+ break;
+ case 3:
+ goto out_bcon;
+ }
+}
+
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index c9187b9..88efc78 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1332,8 +1332,7 @@ group_case_labels_stmt (gimple stmt)
{
int old_size = gimple_switch_num_labels (stmt);
int i, j, new_size = old_size;
- tree default_case = NULL_TREE;
- tree default_label = NULL_TREE;
+ basic_block default_bb = NULL;
bool has_default;
/* The default label is always the first case in a switch
@@ -1342,8 +1341,8 @@ group_case_labels_stmt (gimple stmt)
if (!CASE_LOW (gimple_switch_default_label (stmt))
&& !CASE_HIGH (gimple_switch_default_label (stmt)))
{
- default_case = gimple_switch_default_label (stmt);
- default_label = CASE_LABEL (default_case);
+ tree default_case = gimple_switch_default_label (stmt);
+ default_bb = label_to_block (CASE_LABEL (default_case));
has_default = true;
}
else
@@ -1356,15 +1355,17 @@ group_case_labels_stmt (gimple stmt)
i = 0;
while (i < old_size)
{
- tree base_case, base_label, base_high;
+ tree base_case, base_high;
+ basic_block base_bb;
+
base_case = gimple_switch_label (stmt, i);
gcc_assert (base_case);
- base_label = CASE_LABEL (base_case);
+ base_bb = label_to_block (CASE_LABEL (base_case));
/* Discard cases that have the same destination as the
default case. */
- if (base_label == default_label)
+ if (base_bb == default_bb)
{
gimple_switch_set_label (stmt, i, NULL_TREE);
i++;
@@ -1383,13 +1384,13 @@ group_case_labels_stmt (gimple stmt)
while (i < old_size)
{
tree merge_case = gimple_switch_label (stmt, i);
- tree merge_label = CASE_LABEL (merge_case);
+ basic_block merge_bb = label_to_block (CASE_LABEL (merge_case));
double_int bhp1 = double_int_add (tree_to_double_int (base_high),
double_int_one);
/* Merge the cases if they jump to the same place,
and their ranges are consecutive. */
- if (merge_label == base_label
+ if (merge_bb == base_bb
&& double_int_equal_p (tree_to_double_int (CASE_LOW (merge_case)),
bhp1))
{