------- Comment #11 from rguenth at gcc dot gnu dot org 2006-04-07 11:34 ------- 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. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23855