This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ivopts improvement


On 03/14/2011 01:14 PM, Zdenek Dvorak wrote:
> Hi,
> 
>>>> +  /* Determine if the exit test is formulated in terms of the phi or the
>>>> +     increment of the use iv.  */
>>>> +  use_uses_inced_iv
>>>> +    = gimple_code (SSA_NAME_DEF_STMT (use->iv->ssa_name)) != GIMPLE_PHI;
>>>> +
>>>> +  /* Determine if the exit test is before or after the increment of the
>>>> +     cand.  */
>>>> +  use_after_cand_inc
>>>> +    = stmt_after_increment (data->current_loop, cand, use->stmt);
>>>> +
>>>> +  /* For now, we only handle these cases.  */
>>>> +  if (use_after_cand_inc != use_uses_inced_iv)
>>>> +    return false;
>>>
>>> what is this trying to achieve?  USE_USES_INCED_IV is pretty much meaningless --
>>> the value of USE does not depend in any way on whether it comes
>>> directly from
>>> a PHI node or from some other calculation.
>>
>> it is trying to allow for
>>
>> do
>>   {
>>     *p = '\0';
>>     i++; /* use_uses_inced_iv == true */
>>     p++; /* use_after_cand_inc == true */
>>     if (!(i < n))
>>       break;
>>   }
>> while (1);
>>
>> and for
>>
>> do
>>   {
>>     *p = '\0';
>>     if (!(i < n))
>>       break;
>>     i++; /* use_uses_inced_iv == false */
>>     p++; /* use_after_cand_inc == false */
>>   }
>> while (1);
>>
>> but not for
>>
>> do
>>   {
>>     *p = '\0';
>>     i++; /* use_uses_inced_iv == true */
>>     if (!(i < n))
>>       break;
>>     p++; /* use_after_cand_inc == false */
>>   }
>> while (1);
>>
>> and not for
>>
>> do
>>   {
>>     *p = '\0';
>>     p++; /* use_after_cand_inc == true */
>>     if (!(i < n))
>>       break;
>>     i++; /* use_uses_inced_iv == false */
>>   }
>> while (1);
>>
>> In the latter 2 cases, I cannot simply replace i < n with p < base + n.
> 
> Why not (other than that the value to compare with varies in these cases, but
> it always is "the value of p in the last iteration of the loop")?

In the 2 latter cases, the value to compare with will be either base + n
+ 1 or base + n - 1. The code does not handle these cases yet.

> One more thing: what is fold_walk_def_plus for?

It tries to fold a plus, and if not successful, finds ssa vars in
operands of the plus, substitutes the defining statements of ssa vars
for those ssa vars and retries folding.

Thanks,
- Tom


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]