------- Comment #13 from rakdver at atrey dot karlin dot mff dot cuni dot cz 2006-04-07 12:57 ------- Subject: Re: loop header should also be pulled out of the inner loop too
> I updated the patch for current mainline, but it still has issues for some > common uses of loops: > > void foo(int *ie, int *je, double *x) > { > int i, j; > for (j=0; j<*je; ++j) > for (i=0; i<*ie; ++i) > x[i+j] = 0.0; > } > > After loop header copying we have > > if (*je > 0) > for (j=0; j<*je; ++j) > if (*ie > 0) > for (i=0; i<*ie; ++i) > x[i+j ] = 0.0; > > note how in this form we see the condition *ie > 0 not invariant wrt the > outer loop (because it does a memory load), but if we would run load-PRE > between loop header copying and guard hoisting we would get > > pretmp.1 = *je; > if (pretmp.1 > 0) > pretmp.2 = *ie; > for (j=0; j<pretmp.1; ++j) > if (pretmp.2 > 0) > for (i=0; i<pretmp.2; ++i) > x[i+j] = 0.0; > > which would enable us to hoist the guard out of the outer loop. this is somewhat problematic; it would work for 2 nested loops, but not for 3 or more (one would need to iterate guard hoisting & invariant motion or PRE for that). It would be possible to integrate guard hoisting into the loop invariant motion pass, I may give it a try. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23855