[PATCH] arm: Fix up neon_vector_mem_operand [PR97528]
Kyrylo Tkachov
Kyrylo.Tkachov@arm.com
Tue Feb 2 17:36:05 GMT 2021
> -----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