GNU bug report logs -
#70474
Possible bug with `atomic-box-swap!` on OSX/M3 (?!?!)
Previous Next
Full log
Message #26 received at 70474 <at> debbugs.gnu.org (full text, mbox):
Andy Wingo in IRC pointed out that the reason the patch appears to work
is that the `movr` isn't idempotent! By the time it comes round again,
`val` has already been overwritten by LDAXR in the case that `dst == val`.
On 22/04/2024 10:18, Tony Garnock-Jones wrote:
> Oh man. This little patch all by itself makes the problem behaviour go
> away. No switching to SWPAL/CASAL, just tightening the spinloop. (And no
> changes at all to the CAS code, so nothing to do with the fibers bug I
> guess.)
>
> With the patch, the spinloop goes LDAXR-STLXR-CBNZ (which is what GCC
> does when SWPAL isn't there) instead of potentially MOV-LDAXR-STLXR-CBNZ
> (which isn't).
>
> Could the machine really be so sensitive to the target of the CBNZ?
>
> ---
> libguile/lightening/lightening/aarch64-cpu.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/libguile/lightening/lightening/aarch64-cpu.c
> b/libguile/lightening/lightening/aarch64-cpu.c
> index 13aa351e9..4df712a0e 100644
> --- a/libguile/lightening/lightening/aarch64-cpu.c
> +++ b/libguile/lightening/lightening/aarch64-cpu.c
> @@ -2532,10 +2532,10 @@ str_atomic(jit_state_t *_jit, int32_t loc,
> int32_t val)
> static void
> swap_atomic(jit_state_t *_jit, int32_t dst, int32_t loc, int32_t val)
> {
> - void *retry = jit_address(_jit);
> int32_t result = jit_gpr_regno(get_temp_gpr(_jit));
> int32_t val_or_tmp = dst == val ? jit_gpr_regno(get_temp_gpr(_jit))
> : val;
> movr(_jit, val_or_tmp, val);
> + void *retry = jit_address(_jit);
> LDAXR(_jit, dst, loc);
> STLXR(_jit, val_or_tmp, loc, result);
> jit_patch_there(_jit, bnei(_jit, result, 0), retry);
This bug report was last modified 1 year and 58 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.