http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57488
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- -fno-tree-partial-pre fixes this, partial PRE figures that v on entry to the l loop is invariant in the outer loop. Thus it does tem = v; for (k = 1; k >= 0; k--) { int l; bar (0); v = tem; for (l = 1; l < 5; l++) { int m; for (m = 6; m; m--) { v--; *ps = *pc; } } } effectively cutting the number of decrements in half.