re PR tree-optimization/53881 (ICE in hoist_edge_and_branch_if_true)
authorSteven Bosscher <steven@gcc.gnu.org>
Sat, 7 Jul 2012 12:35:44 +0000 (12:35 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Sat, 7 Jul 2012 12:35:44 +0000 (12:35 +0000)
gcc/
PR tree-optimization/53881
* tree-switch-conversion.c (emit_case_bit_tests): Do not rely on
comparing labels to establish uniqueness of a switch case target,
use the CFG instead.

testsuite/
PR tree-optimization/53881
* gcc.dg/pr53881.c: New test.

From-SVN: r189349

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr53881.c [new file with mode: 0644]
gcc/tree-switch-conversion.c

index 1e1f7dca83bf7562b8414f908c7004c8e191c47d..908a6792ece757b8868d91e0a2b3df1285ee136e 100644 (file)
@@ -1,3 +1,10 @@
+2012-07-07  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR tree-optimization/53881
+       * tree-switch-conversion.c (emit_case_bit_tests): Do not rely on
+       comparing labels to establish uniqueness of a switch case target,
+       use the CFG instead.
+
 2012-07-07  Ulrich Weigand  <ulrich.weigand@linaro.org>
 
        * combine.c (force_to_mode) [LSHIFTRT]: Avoid undefined behaviour
index 0e79dc33fb757cf4a3375945f8ba0eb9cb45726b..b7b0a5ce8f7c39b3162697f7839b5835c7ad3e74 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-07  Steven Bosscher  <steven@gcc.gnu.org>
+
+       PR tree-optimization/53881
+       * gcc.dg/pr53881.c: New test.
+
 2012-07-06  Jason Merrill  <jason@redhat.com>
 
        PR c++/53862
diff --git a/gcc/testsuite/gcc.dg/pr53881.c b/gcc/testsuite/gcc.dg/pr53881.c
new file mode 100644 (file)
index 0000000..435d938
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int a, b;
+void
+fn1 ()
+{
+  int c;
+  switch (a)
+    {
+    case 8:
+      c = 0;
+      goto Label;
+    case 0:
+    case 1:
+Label:
+      break;
+    default:
+      b = 0;
+    }
+}
+
index de8c9e874d6c84205483c76f942eb2e242d3f619..94fbf1dec69095bde9761e15ac081e5a39dce494 100644 (file)
@@ -329,14 +329,13 @@ emit_case_bit_tests (gimple swtch, tree index_expr,
       unsigned int lo, hi;
       tree cs = gimple_switch_label (swtch, i);
       tree label = CASE_LABEL (cs);
+      edge e = find_edge (switch_bb, label_to_block (label));
       for (k = 0; k < count; k++)
-       if (label == test[k].label)
+       if (e == test[k].target_edge)
          break;
 
       if (k == count)
        {
-         edge e = find_edge (switch_bb, label_to_block (label));
-         gcc_assert (e);
          gcc_checking_assert (count < MAX_CASE_BIT_TESTS);
          test[k].hi = 0;
          test[k].lo = 0;