[Bug rtl-optimization/77877] missed optimization in switch of modulus value
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 6 10:50:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77877
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |missed-optimization
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-10-06
Component|tree-optimization |rtl-optimization
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
The point is that with the modulus visible VRP will remove the default case
(or rather take a random one -- here the first one -- as new default):
<bb 2>:
n_9 = n_8(D) % 3;
switch (n_9) <default: <L0>, case 1: <L1>, case 2: <L2>>
<L0>:
zero.0_1 = zero;
_2 = zero.0_1 + 1;
zero = _2;
goto <bb 6>;
<L1>:
one.1_3 = one;
_4 = one.1_3 + 1;
one = _4;
goto <bb 6>;
<L2>:
two.2_5 = two;
_6 = two.2_5 + 1;
two = _6;
<bb 6>:
return;
if we don't have the modulo then the default case will not be optimized away
(not the one with the unreachable either) before RTL expansion. So it looks
like the four-cases variant where one case later vanishes happens to be
expanded better.
Which means we should improve expansion for the IL case above
(stmt.c:expand_case). Or work around by choosing another value as
the "default" if that makes expand_case happy.
More information about the Gcc-bugs
mailing list