https://gcc.gnu.org/g:b29abdc333cce9acbc9537a1df8a4ec09444658f

commit r16-3125-gb29abdc333cce9acbc9537a1df8a4ec09444658f
Author: Andre Vieira <andre.simoesdiasvie...@arm.com>
Date:   Mon Aug 11 09:49:18 2025 +0100

    arm: Fix operand check for __arm_{mrrc{2},mcrr{2]} intrinsics [PR 121464]
    
    Fix the bound checking for the opc1  operand of the following intrinsics:
      __arm_mcrr
      __arm_mcrr2
      __arm_mrrc
      __arm_mrrc2
    
    gcc/ChangeLog:
    
            PR target/121464
            * config/arm/arm.md (arm_<mrrc>, arm_<mcrr>): Fix operand check.
    
    gcc/testsuite/ChangeLog:
    
            PR target/121464
            * gcc.target/arm/acle/mcrr.c: Update testcase.
            * gcc.target/arm/acle/mcrr2.c: Likewise.
            * gcc.target/arm/acle/mrrc.c: Likewise.
            * gcc.target/arm/acle/mrrc2.c: Likewise.

Diff:
---
 gcc/config/arm/arm.md                     |  4 ++--
 gcc/testsuite/gcc.target/arm/acle/mcrr.c  | 21 +++++++++++++++++++--
 gcc/testsuite/gcc.target/arm/acle/mcrr2.c | 24 ++++++++++++++++++++++--
 gcc/testsuite/gcc.target/arm/acle/mrrc.c  | 20 +++++++++++++++++++-
 gcc/testsuite/gcc.target/arm/acle/mrrc2.c | 18 +++++++++++++++++-
 5 files changed, 79 insertions(+), 8 deletions(-)

diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 537a3e26a454..422ae549b65b 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -13026,7 +13026,7 @@
   "arm_coproc_builtin_available (VUNSPEC_<MCRR>)"
 {
   arm_const_bounds (operands[0], 0, 16);
-  arm_const_bounds (operands[1], 0, 8);
+  arm_const_bounds (operands[1], 0, 16);
   arm_const_bounds (operands[3], 0, (1 << 5));
   return "<mcrr>\\tp%c0, %1, %Q2, %R2, CR%c3";
 }
@@ -13041,7 +13041,7 @@
   "arm_coproc_builtin_available (VUNSPEC_<MRRC>)"
 {
   arm_const_bounds (operands[1], 0, 16);
-  arm_const_bounds (operands[2], 0, 8);
+  arm_const_bounds (operands[2], 0, 16);
   arm_const_bounds (operands[3], 0, (1 << 5));
   return "<mrrc>\\tp%c1, %2, %Q0, %R0, CR%c3";
 }
diff --git a/gcc/testsuite/gcc.target/arm/acle/mcrr.c 
b/gcc/testsuite/gcc.target/arm/acle/mcrr.c
index 468dd96fb9b6..5081f7153142 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mcrr.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mcrr.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc3_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,6 +16,22 @@ void test_mcrr (uint64_t a)
   a += 77;
   __arm_mcrr (10, 5, a, 3);
 }
+/*
+** test_mcrr:
+** ...
+**     add.*#77
+** ...
+**     mcrr    p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "add\[^\n\]*#77\n" } } */
-/* { dg-final { scan-assembler "mcrr\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+void test_mcrr_pr121464 (uint64_t a)
+{
+  __arm_mcrr (7, 11, a, 0);
+}
+/*
+** test_mcrr_pr121464:
+** ...
+**     mcrr    p7, #11, r[0-9]+, r[0-9]+, CR0
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mcrr2.c 
b/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
index 1173ad06b533..a0f93cc89155 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mcrr2.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc4_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,6 +16,25 @@ void test_mcrr2 (uint64_t a)
   a += 77;
   __arm_mcrr2 (10, 5, a, 3);
 }
+/*
+** test_mcrr2:
+** ...
+**     add.*#77
+** ...
+**     mcrr2   p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "add\[^\n\]*#77\n" } } */
-/* { dg-final { scan-assembler "mcrr2\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+void test_mcrr2_pr121464 (void)
+{
+  __arm_mcrr2 (3, 12, 49, 4);
+}
+
+/*
+** test_mcrr2_pr121464:
+** ...
+**     mov.*#49
+** ...
+**     mcrr2   p3, #12, r[0-9]+, r[0-9]+, CR4
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mrrc.c 
b/gcc/testsuite/gcc.target/arm/acle/mrrc.c
index c004660fadca..54e542bb102d 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mrrc.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mrrc.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc3_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -15,4 +16,21 @@ uint64_t test_mrrc (void)
   return __arm_mrrc (10, 5, 3);
 }
 
-/* { dg-final { scan-assembler "mrrc\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+/*
+** test_mrrc:
+** ...
+**     mrrc    p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
+
+uint64_t test_mrrc_pr121464 (void)
+{
+  return __arm_mrrc (15, 9, 7);
+}
+
+/*
+** test_mrrc_pr121464:
+** ...
+**     mrrc    p15, #9, r[0-9]+, r[0-9]+, CR7
+** ...
+*/
diff --git a/gcc/testsuite/gcc.target/arm/acle/mrrc2.c 
b/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
index b5d56da8f90b..8d8937adb4e4 100644
--- a/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
+++ b/gcc/testsuite/gcc.target/arm/acle/mrrc2.c
@@ -3,6 +3,7 @@
 /* { dg-do assemble } */
 /* { dg-options "-save-temps" } */
 /* { dg-require-effective-target arm_coproc4_ok } */
+/* { dg-final { check-function-bodies "**" "" "" } } */
 
 #include "arm_acle.h"
 #if (__ARM_ARCH < 8 || !defined (__ARM_ARCH_ISA_ARM)) \
@@ -14,5 +15,20 @@ uint64_t test_mrrc2 (void)
 {
   return __arm_mrrc2 (10, 5, 3);
 }
+/*
+** test_mrrc2:
+** ...
+**     mrrc2   p10, #5, r[0-9]+, r[0-9]+, CR3
+** ...
+*/
 
-/* { dg-final { scan-assembler "mrrc2\tp10, #5, r\[r0-9\]*, r\[r0-9\]*, CR3\n" 
} } */
+uint64_t test_mrrc2_pr121464 (void)
+{
+  return __arm_mrrc2 (0, 15, 10);
+}
+/*
+** test_mrrc2_pr121464:
+** ...
+**     mrrc2   p0, #15, r[0-9]+, r[0-9]+, CR10
+** ...
+*/

Reply via email to