Hi, For test case gcc.dg/tree-ssa/ivopt_inter_2.c #ifndef TYPE #define TYPE char* #endif
extern char a[]; /* Can not infer loop iteration from array -- exit test can not be replaced. */ void foo (unsigned int i_width, TYPE dst) { unsigned long long i = 0; unsigned long long j = 0; for ( ; j < i_width; ) { *dst = a[i]; dst++; i += 2; j += 1; } } /* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */ /* { dg-final { cleanup-tree-dump "ivopts" } } */ It checks whether the test is eliminated by address iv candidate, which is fragile. Giving the ivopt dump file : foo (unsigned int i_width, char * dst) { long long unsigned int j; long long unsigned int i; long long unsigned int _4; char _9; long long unsigned int _18; <bb 2>: _18 = (long long unsigned int) i_width_7(D); if (_18 != 0) goto <bb 3>; else goto <bb 7>; <bb 3>: <bb 4>: # j_21 = PHI <j_13(5), 0(3)> _9 = MEM[symbol: a, index: j_21, step: 2, offset: 0B]; MEM[base: dst_5(D), index: j_21, offset: 0B] = _9; j_13 = j_21 + 1; if (j_13 < _18) goto <bb 5>; else goto <bb 6>; <bb 5>: goto <bb 4>; <bb 6>: <bb 7>: return; } It's possible to have "if (j_13 < _18)" eliminated into "if (j_13 != _18)", and the case would fail because of dump message "Replacing exit test: if (j_13 < _18)" Same story for ivopt_mult_3.c Any idea how it should be handled? Thanks. bin -- Best Regards.