Jakub Jelinek <ja...@redhat.com> writes:
> Hi!
>
> The aarch64_simd_stp<mode> pattern uses w constraint in one alternative and
> r in another, but for the latter incorrectly uses <vw> iterator in %<vw>1 
> which
> expands to %d1 for V2DF and %s1 for V2SF and V4SF (this one not relevant to
> the pattern) and %w1 for others, so it ICEs if the alternative is selected
> during final.  Compared to this, <vwcore> macro has the same values for all
> modes but uses w for V2DF and V2SF.
>
> Bootstrapped/regtested on aarch64-linux, ok for trunk?
>
> 2023-11-24  Andrew Pinski  <pins...@gmail.com>
>           Jakub Jelinek  <ja...@redhat.com>
>
>       PR target/109977
>       * config/aarch64/aarch64-simd.md (aarch64_simd_stp<mode>): Use <vwcore>
>       rather than %<vw> for alternative with r constraint on input operand.
>
>       * gcc.dg/pr109977.c: New test.

OK, thanks.

Richard

> --- gcc/config/aarch64/aarch64-simd.md.jj     2023-11-22 22:55:20.577075762 
> +0100
> +++ gcc/config/aarch64/aarch64-simd.md        2023-11-24 12:51:22.855215700 
> +0100
> @@ -269,7 +269,7 @@ (define_insn "aarch64_simd_stp<mode>"
>    "TARGET_SIMD"
>    {@ [ cons: =0 , 1 ; attrs: type            ]
>       [ Umn      , w ; neon_stp               ] stp\t%<Vetype>1, %<Vetype>1, 
> %y0
> -     [ Umn      , r ; store_<ldpstp_vel_sz>  ] stp\t%<vw>1, %<vw>1, %y0
> +     [ Umn      , r ; store_<ldpstp_vel_sz>  ] stp\t%<vwcore>1, %<vwcore>1, 
> %y0
>    }
>  )
>  
> --- gcc/testsuite/gcc.dg/pr109977.c.jj        2023-11-24 12:51:04.551473591 
> +0100
> +++ gcc/testsuite/gcc.dg/pr109977.c   2023-11-24 12:50:44.158760916 +0100
> @@ -0,0 +1,16 @@
> +/* PR target/109977 */
> +/* { dg-do compile } */
> +/* { dg-options "-Og" } */
> +
> +typedef double __attribute__((__vector_size__ (8))) V;
> +typedef double __attribute__((__vector_size__ (16))) W;
> +V v;
> +int i;
> +extern void bar (void *);
> +
> +void
> +foo (void)
> +{
> +  W w = __builtin_shufflevector (v, (W) { }, 0, 0);
> +  bar (&w);
> +}
>
>       Jakub

Reply via email to