http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54634
--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-09-20
12:26:53 UTC ---
We split
<bb 89>:
# s2_207 = PHI <0.0(88), s2_524(91)>
# prephitmp_1456 = PHI <0(88), k.76_530(91)>
_496 = prephitmp_1456 * -2;
_1535 = lx_355 + _496;
D.3330 = _1535;
_1533 = binomial (&j, &k);
_517 = binomial (&ma, &D.3330);
_518 = _1533 * _517;
_520 = _518 * 0.0;
s2_524 = _520 + s2_207;
D.3330 ={v} {CLOBBER};
k.76_530 = prephitmp_1456 + 1;
k = k.76_530;
if (j.72_383 == prephitmp_1456)
goto <bb 90>;
else
goto <bb 91>;
into bogus pieces:
<bb 204>:
# prephitmp_1664 = PHI <k.76_1674(205), 0(88)>
_1665 = prephitmp_1664 * -2;
_1666 = lx_355 + _1665;
D.3330 = _1666;
D.3330 ={v} {CLOBBER};
k.76_1674 = prephitmp_1664 + 1;
if (j.72_383 == prephitmp_1664)
goto <bb 206>;
else
goto <bb 205>;
split for the store D.3330 (huh, well ...), but somehow lost the
binomial call here.
<bb 207>:
# prephitmp_1678 = PHI <k.76_1688(208), 0(206)>
k.76_1688 = prephitmp_1678 + 1;
k = k.76_1688;
if (j.72_383 == prephitmp_1678)
goto <bb 209>;
else
goto <bb 208>;
well ... likewise.
<bb 89>:
# s2_207 = PHI <0.0(209), s2_524(91)>
# prephitmp_1456 = PHI <0(209), k.76_530(91)>
_1533 = binomial (&j, &k);
_517 = binomial (&ma, &D.3330);
_518 = _1533 * _517;
_520 = _518 * 0.0;
s2_524 = _520 + s2_207;
k.76_530 = prephitmp_1456 + 1;
if (j.72_383 == prephitmp_1456)
goto <bb 90>;
else
goto <bb 91>;
finally all the calls. Investigating some more.
Ah, binomial () is pure. The RDG is bogus, it does not consider
calls that merely read unknown memory. That is because
get_references_in_stmt handles calls by returning true/false only ...
in this case it doesn't add any data references.
So it's a very old problem that bites us now.
*sigh*