On 01/08/2025 13:27, Richard Biener wrote:
On Thu, Jul 31, 2025 at 11:44 AM Richard Biener
<richard.guent...@gmail.com> wrote:
On Mon, May 19, 2025 at 6:38 PM Richard Earnshaw <rearn...@arm.com> wrote:
It's not enough to just check that a memory operand is of the form
mem(reg); after RA we also need to validate the register being used.
The safest way to do this is to call memory_operand.
I have bootstrapped/tested this on x86_64-linux (yeah...) on the 15
branch as well.
15.2 RC is tomorrow, can you please test&push there as well?
Sam tested this on arm, so I pushed it for 15.2 now.
Thanks. Sorry, I missed your previous mail on this.
R.
Richard.
Richard.
PR target/120351
gcc/ChangeLog:
* config/arm/predicates.md (mem_noofs_operand): Also check the op
is a valid memory_operand.
gcc/testsuite/ChangeLog:
* gcc.target/arm/pr120351.c: New test.
---
gcc/config/arm/predicates.md | 3 +-
gcc/testsuite/gcc.target/arm/pr120351.c | 47 +++++++++++++++++++++++++
2 files changed, 49 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.target/arm/pr120351.c
diff --git a/gcc/config/arm/predicates.md b/gcc/config/arm/predicates.md
index 57d4ec66088..c683ec2c607 100644
--- a/gcc/config/arm/predicates.md
+++ b/gcc/config/arm/predicates.md
@@ -901,7 +901,8 @@ (define_special_predicate "add_operator"
(define_predicate "mem_noofs_operand"
(and (match_code "mem")
- (match_code "reg" "0")))
+ (match_code "reg" "0")
+ (match_operand 0 "memory_operand")))
(define_predicate "call_insn_operand"
(ior (and (match_code "symbol_ref")
diff --git a/gcc/testsuite/gcc.target/arm/pr120351.c
b/gcc/testsuite/gcc.target/arm/pr120351.c
new file mode 100644
index 00000000000..d8e9d73275c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pr120351.c
@@ -0,0 +1,47 @@
+/* { dg-do assemble } */
+/* { dg-require-effective-target arm_neon_ok } */
+/* { dg-add-options arm_neon } */
+/* { dg-additional-options "-O2" } */
+
+
+typedef struct A
+{
+ int f1;
+} A;
+
+__inline void ref (A* x)
+{
+ __atomic_fetch_add(&x->f1, 1, 0);
+}
+
+typedef struct B
+{
+ A *d;
+ int *ptr;
+} B;
+
+void insertOne (B*, B*);
+
+void init (B *);
+__inline void copy (B *p, B *q)
+{
+ p->d = q->d;
+ p->ptr = q->ptr;
+ ref (p->d);
+}
+
+__inline void emplace(B* x)
+{
+ B dummy;
+ B _tmp;
+ init (&dummy);
+ copy (&_tmp, &dummy);
+ insertOne(x, &_tmp);
+}
+
+void testing ()
+{
+ B test;
+ init (&test);
+ emplace(&test);
+}
--
2.43.0