Patchwork PR53881

login
register
mail settings
Submitter Steven Bosscher
Date July 7, 2012, 12:41 p.m.
Message ID <CABu31nN6BACz0npKkcxyoEhj5b3qO1uHvfDMC1oDHFHK3Fw93A@mail.gmail.com>
Download mbox | patch
Permalink /patch/169594/
State New
Headers show

Comments

Steven Bosscher - July 7, 2012, 12:41 p.m.
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.

Patch

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;