On Wed, Jun 19, 2013 at 10:04 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: > 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?
Probably by checking for the real issue - I suppose at some point the number of iterations was infered to be zero or one. Richard. > Thanks. > bin > -- > Best Regards.