On Wed, 24 Mar 2021 at 10:45, Jakub Jelinek <ja...@redhat.com> wrote:
>
> Hi!
>
> The following patch fixes similar issues as in PR98849 -
> in older gcc versions, the expanders were present in neon.md guarded
> with TARGET_NEON, but they got moved to vec-common.md and guarded with
> ARM_HAVE_<MODE>_ARITH so that they handle both MVE and Neon.
> The macros are enabled for some modes even for iwmmxt which has some
> vector support for those modes, but only limited.  In particular,
> neither the one_cmpl, nor neg, nor movmisalign patterns are present.
> For some reason I've failed to construct something that ICEs with
> movmisalign, so that is not covered by the testsuite, but both
> one_cmpl and neg ICE.
>
> Bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk?
>
> 2021-03-24  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/99724
>         * config/arm/vec-common.md (one_cmpl<mode>2, neg<mode>2,
>         movmisalign<mode>): Disable expanders for TARGET_REALLY_IWMMXT.
>
>         * gcc.target/arm/pr99724.c: New test.
>

Looks good to me, thanks and sorry for introducing this bug.

Christophe

> --- gcc/config/arm/vec-common.md.jj     2021-03-23 16:13:54.231382897 +0100
> +++ gcc/config/arm/vec-common.md        2021-03-23 20:33:52.708846358 +0100
> @@ -202,13 +202,13 @@ (define_expand "xor<mode>3"
>  (define_expand "one_cmpl<mode>2"
>    [(set (match_operand:VDQ 0 "s_register_operand")
>         (not:VDQ (match_operand:VDQ 1 "s_register_operand")))]
> -  "ARM_HAVE_<MODE>_ARITH"
> +  "ARM_HAVE_<MODE>_ARITH && !TARGET_REALLY_IWMMXT"
>  )
>
>  (define_expand "neg<mode>2"
>    [(set (match_operand:VDQWH 0 "s_register_operand" "")
>         (neg:VDQWH (match_operand:VDQWH 1 "s_register_operand" "")))]
> -  "ARM_HAVE_<MODE>_ARITH"
> +  "ARM_HAVE_<MODE>_ARITH && !TARGET_REALLY_IWMMXT"
>  )
>
>  (define_expand "cadd<rot><mode>3"
> @@ -281,7 +281,8 @@ (define_expand "movmisalign<mode>"
>   [(set (match_operand:VDQX 0 "neon_perm_struct_or_reg_operand")
>         (unspec:VDQX [(match_operand:VDQX 1 
> "neon_perm_struct_or_reg_operand")]
>          UNSPEC_MISALIGNED_ACCESS))]
> - "ARM_HAVE_<MODE>_LDST && !BYTES_BIG_ENDIAN && unaligned_access"
> + "ARM_HAVE_<MODE>_LDST && !BYTES_BIG_ENDIAN
> +  && unaligned_access && !TARGET_REALLY_IWMMXT"
>  {
>   rtx adjust_mem;
>   /* This pattern is not permitted to fail during expansion: if both arguments
> --- gcc/testsuite/gcc.target/arm/pr99724.c.jj   2021-03-23 19:52:18.624188126 
> +0100
> +++ gcc/testsuite/gcc.target/arm/pr99724.c      2021-03-23 20:33:32.866063889 
> +0100
> @@ -0,0 +1,31 @@
> +/* PR target/99724 */
> +/* { dg-do compile } */
> +/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mcpu=*" } 
> { "-mcpu=iwmmxt" } } */
> +/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-mabi=*" } 
> { "-mabi=iwmmxt" } } */
> +/* { dg-skip-if "Test is specific to the iWMMXt" { arm*-*-* } { "-march=*" } 
> { "-march=iwmmxt" } } */
> +/* { dg-skip-if "Test is specific to ARM mode" { arm*-*-* } { "-mthumb" } { 
> "" } } */
> +/* { dg-require-effective-target arm32 } */
> +/* { dg-require-effective-target arm_iwmmxt_ok } */
> +/* { dg-options "-O1 -mcpu=iwmmxt" } */
> +
> +typedef int V __attribute__((vector_size (8)));
> +struct __attribute__((packed)) S { char a; V b; char c[7]; };
> +
> +void
> +foo (V *x)
> +{
> +  *x = ~*x;
> +}
> +
> +void
> +bar (V *x)
> +{
> +  *x = -*x;
> +}
> +
> +void
> +baz (V *x, struct S *p)
> +{
> +  V y = p->b;
> +  *x = y;
> +}
>
>         Jakub
>

Reply via email to