PATCH: PR71818: Don't advance IVs with a variable step

Alan Hayward alan.hayward@arm.com
Mon Aug 1 14:26:00 GMT 2016



On 01/08/2016 14:49, "Richard Biener" <richard.guenther@gmail.com> wrote:

>On Mon, Aug 1, 2016 at 11:24 AM, Alan Hayward <alan.hayward@arm.com>
>wrote:
>> In the given test case, the loop is split into vectorised and non
>> vectorised
>> versions due to peeling. At the end of the loop the IVs are incremented
>>to
>> their latest value. This is achieved by taking the base of the loop
>>(g_21)
>> and
>> adding the iterations (240) multiplied by the step (_6):
>>
>>   <bb 15>:
>>   # _106 = PHI <_6(12)>
>>   _84 = _106 * 240;
>>   _85 = (char) _84;
>>   tmp.19_83 = g_21(D) + _85;
>>
>> However, the step (_6) varies within the loop and therefore the
>> calculation is
>> incorrect.
>>
>> This patch fixes the error by disallowing vectorization if the step of
>>the
>> IV
>> is not an invariant within the loop.
>>
>> Also added debug comment for when the optimisation fails due to chrec.
>>
>> Tested on x86.
>>
>> Ok to commit?
>
>Ok.
>
>To fix this we'd have to vectorize the induction variable itself, correct?


Yes, then extract final value with BIT_FIELD_REF (like
vectorise_live_operation).


Alan.




More information about the Gcc-patches mailing list