On Wed, Jun 19, 2013 at 4:43 PM, Richard Biener
<[email protected]> wrote:
> On Wed, Jun 19, 2013 at 10:04 AM, Bin.Cheng <[email protected]> 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.
>
But the analyze result of loop is:
Analyzing # of iterations of loop 1
exit condition [1, + , 1] < (long long unsigned int) i_width_7(D)
bounds on difference of bases: 0 ... 18446744073709551614
result:
# of iterations (long long unsigned int) i_width_7(D) +
18446744073709551615, bounded by 18446744073709551614
number of iterations (long long unsigned int) i_width_7(D) +
18446744073709551615
--
Best Regards.