------- Comment #5 from jakub at gcc dot gnu dot org 2007-07-03 14:18 -------
The *.pre dump is clearly wrong:
pretmp.53_53 = *order_p_25(D);
<bb 7>:
# prephitmp.45_125 = PHI <storetmp.41_94(20), storetmp.41_92(21)>
...
D.1445_69 = pretmp.53_53;
storetmp.41_92 = D.1445_69;
*order_p_25(D) = D.1445_69;
i_71 = i_2 + 1;
if (i_2 == D.1401_27)
goto <bb 11>;
else
goto <bb 21>;
<bb 21>:
goto <bb 7>;
i.e. *order_p won't ever change in the loop.
Before *.pre it was changes correctly:
...
<bb 7>:
# i_2 = PHI <1(20), i_71(21)>
D.1421_29 = *order_p_25(D);
...
D.1439_48 = (*D.1423_32)[D.1438_47];
D.1440_49 = D.1421_29 + D.1439_48;
D.1441_64 = D.1435_44 * 2;
D.1442_65 = D.1441_64 + D.1437_46;
D.1443_67 = D.1442_65 + D.1434_43;
D.1444_68 = (*D.1423_32)[D.1443_67];
D.1445_69 = D.1440_49 - D.1444_68;
*order_p_25(D) = D.1445_69;
i_71 = i_2 + 1;
if (i_2 == D.1401_27)
goto <bb 11>;
else
goto <bb 21>;
<bb 21>:
goto <bb 7>;
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32604