[PATCH][AArch64] Fix atomic_cmp_exchange_zero_reg_1.c with +lse
James Greenhalgh
james.greenhalgh@arm.com
Wed Jun 21 14:44:00 GMT 2017
On Wed, Jun 21, 2017 at 02:48:20PM +0100, Kyrill Tkachov wrote:
> Hi all,
>
> As Andrew pointed out, the patch at r248921
> (https://gcc.gnu.org/ml/gcc-patches/2017-02/msg01648.html) that allowed
> const0_rtx as an argument to the compare-exchange patterns was incomplete. It
> didn't extend the TARGET_LSE patterns as well, causing the expander to
> generate an invalid pattern that the insn_and_split and define_insns didn't
> accept. This patch extends them as well to allow aarch64_reg_or_zero rather
> than just register_operand in the operand they're comparing against.
>
> With this patch the testcase compiles successfully with +lse, generating a
> "casa w1, wzr, [x0]".
>
> Bootstrapped and tested on aarch64-none-linux-gnu.
>
> Ok for trunk?
This looks correct to me.
OK for trunk.
James
> 2017-06-21 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
>
> * config/aarch64/atomics.md (aarch64_compare_and_swap<mode>_lse,
> SHORT): Relax operand 3 to aarch64_reg_or_zero and constraint to Z.
> (aarch64_compare_and_swap<mode>_lse, GPI): Likewise.
> (aarch64_atomic_cas<mode>, SHORT): Likewise for operand 2.
> (aarch64_atomic_cas<mode>, GPI): Likewise.
> diff --git a/gcc/config/aarch64/atomics.md b/gcc/config/aarch64/atomics.md
> index 27fc193..32b7169 100644
> --- a/gcc/config/aarch64/atomics.md
> +++ b/gcc/config/aarch64/atomics.md
> @@ -94,7 +94,7 @@
> (set (match_dup 1)
> (unspec_volatile:SHORT
> [(match_operand:SI 2 "aarch64_plus_operand" "rI") ;; expected
> - (match_operand:SHORT 3 "register_operand" "r") ;; desired
> + (match_operand:SHORT 3 "aarch64_reg_or_zero" "rZ") ;; desired
> (match_operand:SI 4 "const_int_operand") ;; is_weak
> (match_operand:SI 5 "const_int_operand") ;; mod_s
> (match_operand:SI 6 "const_int_operand")] ;; mod_f
> @@ -119,7 +119,7 @@
> (set (match_dup 1)
> (unspec_volatile:GPI
> [(match_operand:GPI 2 "aarch64_plus_operand" "rI") ;; expect
> - (match_operand:GPI 3 "register_operand" "r") ;; desired
> + (match_operand:GPI 3 "aarch64_reg_or_zero" "rZ") ;; desired
> (match_operand:SI 4 "const_int_operand") ;; is_weak
> (match_operand:SI 5 "const_int_operand") ;; mod_s
> (match_operand:SI 6 "const_int_operand")] ;; mod_f
> @@ -616,7 +616,7 @@
> (set (match_dup 1)
> (unspec_volatile:SHORT
> [(match_dup 0)
> - (match_operand:SHORT 2 "register_operand" "r") ;; value.
> + (match_operand:SHORT 2 "aarch64_reg_or_zero" "rZ") ;; value.
> (match_operand:SI 3 "const_int_operand" "")] ;; model.
> UNSPECV_ATOMIC_CAS))]
> "TARGET_LSE && reload_completed"
> @@ -640,7 +640,7 @@
> (set (match_dup 1)
> (unspec_volatile:GPI
> [(match_dup 0)
> - (match_operand:GPI 2 "register_operand" "r") ;; value.
> + (match_operand:GPI 2 "aarch64_reg_or_zero" "rZ") ;; value.
> (match_operand:SI 3 "const_int_operand" "")] ;; model.
> UNSPECV_ATOMIC_CAS))]
> "TARGET_LSE && reload_completed"
More information about the Gcc-patches
mailing list