[patch] PR53881
Steven Bosscher
stevenb.gcc@gmail.com
Sat Jul 7 12:41:00 GMT 2012
Hello,
I was relying on the assumption that all case labels in a switch
vector that jump to the same target block would also have the same
CASE_LABEL. This isn't so for the test case of PR53881, where DCE
removes a dead statement but preserves a user label. Fortunately,
using find_edge in emit_case_bit_tests is cheap because we know that
there are very few edges going out of the switch (at most 3) and
usually only one incoming edge per case target.
Bootstrapped on powerpc64-unknown-linux-gnu. Committed as obvious (r189349).
Ciao!
Steven
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.
Index: gcc/tree-switch-conversion.c
--- trunk/gcc/tree-switch-conversion.c 2012/07/07 12:27:33 189348
+++ trunk/gcc/tree-switch-conversion.c 2012/07/07 12:35:44 189349
@@ -329,14 +329,13 @@
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;
More information about the Gcc-patches
mailing list