On Wed, Jun 19, 2013 at 8:33 PM, Richard Biener
<richard.guent...@gmail.com> wrote:
> On Wed, Jun 19, 2013 at 12:35 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>> On Wed, Jun 19, 2013 at 4:43 PM, Richard Biener
>> <richard.guent...@gmail.com> wrote:
>>> 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.
>>>
If I was right, this case is intended to test the exit test "j_13 <
_18" cannot be replaced by using the array address, i.e., something
like "a_XXX != YYY".  Why it is fragile is because the exit test might
be replaced by "j_13 != _18". In this case, the use is eliminated by a
candidate has same iv->base/step as the use itself.

It's possible to dump additional information like "if (j_13 < _18)
eliminated into if (j_13 !=> _18) because of candidate with same
base/step" , thus we can check this valid elimination in test case.
Any advice?

Hi Tom, since you adapted the test case, I am ccing you for some comments too.

Thanks.
bin

Reply via email to