diff mbox series

arm: Fix some more vec-common.md patterns for iwmmxt [PR99724]

Message ID 20210324094451.GF186063@tucnak
State New
Headers show
Series arm: Fix some more vec-common.md patterns for iwmmxt [PR99724] | expand

Commit Message

Jakub Jelinek March 24, 2021, 9:44 a.m. UTC
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  <jakub@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.


	Jakub

Comments

Christophe Lyon March 24, 2021, 9:47 a.m. UTC | #1
On Wed, 24 Mar 2021 at 10:45, Jakub Jelinek <jakub@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  <jakub@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
>
Kyrylo Tkachov March 24, 2021, 9:53 a.m. UTC | #2
> -----Original Message-----
> From: Jakub Jelinek <jakub@redhat.com>
> Sent: 24 March 2021 09:45
> 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; Christophe Lyon <christophe.lyon@linaro.org>
> Subject: [PATCH] arm: Fix some more vec-common.md patterns for iwmmxt
> [PR99724]
> 
> 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?

Ok.
Thanks,
Kyrill

> 
> 2021-03-24  Jakub Jelinek  <jakub@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.
> 
> --- 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
diff mbox series

Patch

--- 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;
+}