------- Comment #4 from rguenth at gcc dot gnu dot org 2009-05-10 09:42 -------
Testcase that fails at -O1 (the key is that reverse needs to be inlined):
extern void abort (void);
static void __attribute__((always_inline))
reverse(int *first, int *last)
{
if (first == last--)
return;
while (first != last)
{
int t = *first;
*first = *last;
*last = t;
if (++first == last--)
break;
}
}
int main()
{
int seq[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
reverse(seq, seq + 8);
if (seq[3] != 5 || seq[4] != 4)
abort ();
return 0;
}
On trunk we optimize it all to obviously wrong
...
t_17 = seq[2];
D.1989_19 = seq[5];
seq[2] = D.1989_19;
seq[5] = t_17;
first_20 = &seq[3];
last_21 = &seq[4];
ivtmp.9_36 = 0;
D.1253_2 = seq[3];
if (D.1253_2 != 5)
thus we iterate one time less as necessary.
--
rguenth at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Component|c |tree-optimization
Ever Confirmed|0 |1
Known to fail| |4.1.2 4.2.4 4.3.3 4.4.0
Known to work| |4.0.4
Last reconfirmed|0000-00-00 00:00:00 |2009-05-10 09:42:26
date| |
Target Milestone|--- |4.3.4
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40087