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.