> Yes, the number of iterations of the i loop simply is too difficult for > our loop iteration calculator to comprehend: > > for (i=k; i<500; i+=k) > > iterates for roundup((500-k)/k) time. In particular if the step is > non-constant our nr-of-iteration calculator gives up. >
I'm trying to give an even smaller case, int a[512] ; int *a_p ; int f(int k) { int i ; for(i=0; i<k; i++) { a_p = &a[i] ; *a_p = 7 ; } } For this case, we have a very simple loop step "i++", then we would have the GIMPLE before expand like below, <bb 5>: # i_13 = PHI <i_6(5), 0(4)> # ivtmp.10_9 = PHI <ivtmp.10_1(5), ivtmp.10_15(4)> a_p_lsm.6_4 = &a[i_13]; ivtmp.10_1 = ivtmp.10_9 + 4; D.4085_16 = (void *) ivtmp.10_1; MEM[base: D.4085_16, offset: 0B] = 7; i_6 = i_13 + 1; if (i_6 != k_3(D)) goto <bb 5>; else goto <bb 6>; <bb 6>: # a_p_lsm.6_11 = PHI <a_p_lsm.6_4(5)> a_p = a_p_lsm.6_11; goto <bb 3>; Why can't we still sunk &a[i_13] out of loop? For example, I expect to generate the code like below, <bb 5>: # i_13 = PHI <i_6(5), 0(4)> # ivtmp.10_9 = PHI <ivtmp.10_1(5), ivtmp.10_15(4)> i_14 = i_13; ivtmp.10_1 = ivtmp.10_9 + 4; D.4085_16 = (void *) ivtmp.10_1; MEM[base: D.4085_16, offset: 0B] = 7; i_6 = i_13 + 1; if (i_6 != k_3(D)) goto <bb 5>; else goto <bb 6>; <bb 6>: # a_p_lsm.6_11 = PHI <a_p_lsm.6_4(5)> a_p_lsm.6_4 = &a[i_14]; a_p = a_p_lsm.6_11; goto <bb 3>; This way the computation of &a[i] would be saved within the loop. Any idea? Thanks, -Jiangning