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.

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
> >

Reply via email to