------- 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