------- Comment #15 from jakub at gcc dot gnu dot org 2007-11-12 19:11 ------- Sorry for the delay.
Unfortunately that doesn't help in this case: on foo from #c7 it is not cselim pass, but lim, which changes: foo (x, y) { int i; <bb 2>: <bb 3>: # i_12 = PHI <i_5(6), 0(2)> if (x_3(D) < i_12) goto <bb 4>; else goto <bb 5>; <bb 4>: v = y_4(D); <bb 5>: i_5 = i_12 + 1; if (i_5 <= 99) goto <bb 6>; else goto <bb 7>; <bb 6>: goto <bb 3>; <bb 7>: return; } into: foo (x, y) { int v_lsm.12; int i; <bb 2>: v_lsm.12_11 = v; <bb 3>: # v_lsm.12_1 = PHI <v_lsm.12_7(6), v_lsm.12_11(2)> # i_12 = PHI <i_5(6), 0(2)> if (x_3(D) < i_12) goto <bb 4>; else goto <bb 5>; <bb 4>: v_lsm.12_10 = y_4(D); <bb 5>: # v_lsm.12_7 = PHI <v_lsm.12_1(3), v_lsm.12_10(4)> i_5 = i_12 + 1; if (i_5 <= 99) goto <bb 6>; else goto <bb 7>; <bb 6>: goto <bb 3>; <bb 7>: # v_lsm.12_15 = PHI <v_lsm.12_7(5)> v = v_lsm.12_15; return; } which is unsafe, as there is no guarantee v is ever written within the loop. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31862