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?

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