> -----Original Message-----
> From: Wilco Dijkstra <[email protected]>
> Sent: 17 September 2026 14:04
> To: gcc-patches mailing list <[email protected]>
> Cc: Kyrylo Tkachov <[email protected]>; Tamar Christina
> <[email protected]>; Alex Coplan <[email protected]>; Alice
> Carlotti <[email protected]>; Andrew Pinski
> <[email protected]>
> Subject: [PATCH] AArch64: Avoid general_operand in atomic_store
>
>
> The generic atomic_store<mode> pattern uses general_operand which blocks
> CSE
> if the store value is an immediate. Fix by using aarch64_reg_or_zero.
>
> Passes regress, OK for commit?
>
OK.
Thanks,
Tamar
> gcc:
> * config/aarch64/atomics.md (atomic_store<mode>): Use
> aarch64_reg_or_zero.
>
> gcc/testsuite:
> * gcc.target/aarch64/atomic-store2.c: New test.
>
> ---
>
> diff --git a/gcc/config/aarch64/atomics.md
> b/gcc/config/aarch64/atomics.md
> index
> 2316fea8135a061a6afd850d5c5fe37062749e4a..c0da49fdb3fb6b2cad1f5d
> 8514013424c9aad7d5 100644
> --- a/gcc/config/aarch64/atomics.md
> +++ b/gcc/config/aarch64/atomics.md
> @@ -735,7 +735,7 @@ (define_insn
> "*aarch64_atomic_load<ALLX:mode>_rcpc_sext"
> (define_insn "atomic_store<mode>"
> [(set (match_operand:ALLI 0 "aarch64_rcpc_memory_operand" "=Q,Ust")
> (unspec_volatile:ALLI
> - [(match_operand:ALLI 1 "general_operand" "rZ,rZ")
> + [(match_operand:ALLI 1 "aarch64_reg_or_zero" "rZ,rZ")
> (match_operand:SI 2 "const_int_operand")] ;;
> model
> UNSPECV_STL))]
> ""
> diff --git a/gcc/testsuite/gcc.target/aarch64/atomic-store2.c
> b/gcc/testsuite/gcc.target/aarch64/atomic-store2.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..85b6cba6f5bc153378
> 0cc69757de62f655d5b48d
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/atomic-store2.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=armv8-a -O2" } */
> +
> +#include <stdatomic.h>
> +
> +void
> +foo (int *p)
> +{
> + atomic_store_explicit (p, 2, memory_order_relaxed);
> + atomic_store_explicit (p + 1, 2, memory_order_release);
> + atomic_store_explicit (p + 2, 2, memory_order_relaxed);
> +}
> +
> +/* { dg-final { scan-assembler-times "mov\tw\[0-9\]+, 2" 1 } } */