[Bug tree-optimization/14799] [tree-ssa] convert a sequence of "if"s to a "switch" statement
tom at codesourcery dot com
gcc-bugzilla@gcc.gnu.org
Fri Jan 14 15:54:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14799
Tom de Vries <tom at codesourcery dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |tom at codesourcery dot com
--- Comment #3 from Tom de Vries <tom at codesourcery dot com> 2011-01-14 15:45:56 UTC ---
The example from the description field looks like this at tree level (optimized
dump with 4.5.1). It takes until late in the rtl untill the duplicate call
blocks are collapsed.
...
foo (int a)
{
<bb 2>:
if (a_1(D) == 30)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
bar (); [tail call]
goto <bb 10>;
<bb 4>:
if (a_1(D) == 31)
goto <bb 5>;
else
goto <bb 6>;
<bb 5>:
bar (); [tail call]
goto <bb 10>;
<bb 6>:
if (a_1(D) == 53)
goto <bb 7>;
else
goto <bb 8>;
<bb 7>:
bar (); [tail call]
goto <bb 10>;
<bb 8>:
if (a_1(D) == 23)
goto <bb 9>;
else
goto <bb 10>;
<bb 9>:
bar (); [tail call]
<bb 10>:
return;
}
...
If the duplicate blocks would have been collapsed, it would look like this:
...
foo (int a)
{
<bb 2>:
if (a_1(D) == 30)
goto <bb 9>;
else
goto <bb 4>;
<bb 4>:
if (a_1(D) == 31)
goto <bb 9>;
else
goto <bb 6>;
<bb 6>:
if (a_1(D) == 53)
goto <bb 9>;
else
goto <bb 8>;
<bb 8>:
if (a_1(D) == 23)
goto <bb 9>;
else
goto <bb 10>;
<bb 9>:
bar (); [tail call]
<bb 10>:
return;
}
...
for this representation, the patch from PR 46935 comment 5 should work.
More information about the Gcc-bugs
mailing list