[PATCH] arm: Fix up neon_vector_mem_operand [PR97528]

Andre Vieira (lists) andre.simoesdiasvieira@arm.com
Wed Feb 3 13:58:22 GMT 2021


Same patch applies cleanly on gcc-8, bootstrapped 
arm-none-linux-gnueabihf and ran regressions also clean.

Can I also commit it to gcc-8?

Thanks,
Andre

On 02/02/2021 17:36, Kyrylo Tkachov wrote:
>
>> -----Original Message-----
>> From: Andre Vieira (lists) <andre.simoesdiasvieira@arm.com>
>> Sent: 02 February 2021 17:27
>> To: gcc-patches@gcc.gnu.org
>> Cc: Kyrylo Tkachov <Kyrylo.Tkachov@arm.com>; jakub@redhat.com
>> Subject: Re: [PATCH] arm: Fix up neon_vector_mem_operand [PR97528]
>>
>> Hi,
>>
>> This is a gcc-9 backport of the PR97528 fix that has been applied to
>> trunk and gcc-10.
>> Bootstraped on arm-linux-gnueabihf and regression tested.
>>
>> OK for gcc-9 branch?
> Ok.
> Thanks,
> Kyrill
>
>> 2021-02-02  Andre Vieira  <andre.simoesdiasvieira@arm.com>
>>
>>       Backport from mainline
>>       2020-11-20  Jakub Jelinek  <jakub@redhat.com>
>>
>>       PR target/97528
>>       * config/arm/arm.c (neon_vector_mem_operand): For POST_MODIFY,
>> require
>>       first POST_MODIFY operand is a REG and is equal to the first operand
>>       of PLUS.
>>
>>       * gcc.target/arm/pr97528.c: New test.
>>
>> On 20/11/2020 11:25, Kyrylo Tkachov via Gcc-patches wrote:
>>>> -----Original Message-----
>>>> From: Jakub Jelinek <jakub@redhat.com>
>>>> Sent: 19 November 2020 18:57
>>>> To: Richard Earnshaw <Richard.Earnshaw@arm.com>; Ramana
>>>> Radhakrishnan <Ramana.Radhakrishnan@arm.com>; Kyrylo Tkachov
>>>> <Kyrylo.Tkachov@arm.com>
>>>> Cc: gcc-patches@gcc.gnu.org
>>>> Subject: [PATCH] arm: Fix up neon_vector_mem_operand [PR97528]
>>>>
>>>> Hi!
>>>>
>>>> The documentation for POST_MODIFY says:
>>>>      Currently, the compiler can only handle second operands of the
>>>>      form (plus (reg) (reg)) and (plus (reg) (const_int)), where
>>>>      the first operand of the PLUS has to be the same register as
>>>>      the first operand of the *_MODIFY.
>>>> The following testcase ICEs, because combine just attempts to simplify
>>>> things and ends up with
>>>> (post_modify (reg1) (plus (mult (reg2) (const_int 4)) (reg1))
>>>> but the target predicates accept it, because they only verify
>>>> that POST_MODIFY's second operand is PLUS and the second operand
>>>> of the PLUS is a REG.
>>>>
>>>> The following patch fixes this by performing further verification that
>>>> the POST_MODIFY is in the form it should be.
>>>>
>>>> Bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk
>>>> and release branches after a while?
>>> Ok.
>>> Thanks,
>>> Kyrill
>>>
>>>> 2020-11-19  Jakub Jelinek  <jakub@redhat.com>
>>>>
>>>> 	PR target/97528
>>>> 	* config/arm/arm.c (neon_vector_mem_operand): For
>>>> POST_MODIFY, require
>>>> 	first POST_MODIFY operand is a REG and is equal to the first operand
>>>> 	of PLUS.
>>>>
>>>> 	* gcc.target/arm/pr97528.c: New test.
>>>>
>>>> --- gcc/config/arm/arm.c.jj	2020-11-13 19:00:46.729620560 +0100
>>>> +++ gcc/config/arm/arm.c	2020-11-18 17:05:44.656867343 +0100
>>>> @@ -13429,7 +13429,9 @@ neon_vector_mem_operand (rtx op, int typ
>>>>      /* Allow post-increment by register for VLDn */
>>>>      if (type == 2 && GET_CODE (ind) == POST_MODIFY
>>>>          && GET_CODE (XEXP (ind, 1)) == PLUS
>>>> -      && REG_P (XEXP (XEXP (ind, 1), 1)))
>>>> +      && REG_P (XEXP (XEXP (ind, 1), 1))
>>>> +      && REG_P (XEXP (ind, 0))
>>>> +      && rtx_equal_p (XEXP (ind, 0), XEXP (XEXP (ind, 1), 0)))
>>>>         return true;
>>>>
>>>>      /* Match:
>>>> --- gcc/testsuite/gcc.target/arm/pr97528.c.jj	2020-11-18
>>>> 17:09:58.195053288 +0100
>>>> +++ gcc/testsuite/gcc.target/arm/pr97528.c	2020-11-18
>>>> 17:09:47.839168237 +0100
>>>> @@ -0,0 +1,28 @@
>>>> +/* PR target/97528 */
>>>> +/* { dg-do compile } */
>>>> +/* { dg-require-effective-target arm_neon_ok } */
>>>> +/* { dg-options "-O1" }  */
>>>> +/* { dg-add-options arm_neon } */
>>>> +
>>>> +#include <arm_neon.h>
>>>> +
>>>> +typedef __simd64_int16_t T;
>>>> +typedef __simd64_uint16_t U;
>>>> +unsigned short c;
>>>> +int d;
>>>> +U e;
>>>> +
>>>> +void
>>>> +foo (void)
>>>> +{
>>>> +  unsigned short *dst = &c;
>>>> +  int g = d, b = 4;
>>>> +  U dc = e;
>>>> +  for (int h = 0; h < b; h++)
>>>> +    {
>>>> +      unsigned short *i = dst;
>>>> +      U j = dc;
>>>> +      vst1_s16 ((int16_t *) i, (T) j);
>>>> +      dst += g;
>>>> +    }
>>>> +}
>>>>
>>>>
>>>> 	Jakub


More information about the Gcc-patches mailing list