[llvm] [RFC][BPF] Do atomic_fetch_*() pattern matching with memory ordering (PR #107343)

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 5 21:55:33 PDT 2024


yonghong-song wrote:

> Also note:
> 
> ```c
> $ cat test2.c
> long f1(_Atomic long *i) { return __c11_atomic_fetch_add(i, 10, __ATOMIC_RELAXED); }
> ```
> 
> ```c
> $ clang --target=bpf -mcpu=v3 -O2 test2.c -c -o - | llvm-objdump -Sdr -
> test2.c:1:6: error: Invalid usage of the XADD return value
>     1 | long f1(_Atomic long *i) { return __c11_atomic_fetch_add(i, 10, __ATOMIC_RELAXED); }
>       |      ^
> 1 error generated.
> 
> <stdin>:	file format elf64-bpf
> 
> Disassembly of section .text:
> 
> 0000000000000000 <f1>:
>        0:	b7 00 00 00 0a 00 00 00	r0 = 0xa
>        1:	db 01 00 00 00 00 00 00	lock *(u64 *)(r1 + 0x0) += r0
>        2:	95 00 00 00 00 00 00 00	exit
> ```
> 
> Which seems incorrect.

You are right. Yes, if the func return value is used, we should just use atomic_fetch_*() insns instead of locked insns.



https://github.com/llvm/llvm-project/pull/107343


More information about the llvm-commits mailing list