https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86005
Alex Bradbury <asb at lowrisc dot org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |asb at lowrisc dot org Summary|[RISCV] Invalid lowering of |[RISCV] Invalid intermixing |atomics for -march=rv32i / |of __atomic_* libcalls and |-march=rv64i |inline atomic instruction | |sequences --- Comment #1 from Alex Bradbury <asb at lowrisc dot org> --- Actually I think this bug is wider in scope than I first thought. GCC will also intermix __atomic libcalls and inline instruction sequences with -march=rv32ia when values less than XLEN in size are accessed. $ cat foo.c char atomic(char *i) { char j = __atomic_add_fetch(i, 1, __ATOMIC_SEQ_CST); char k; __atomic_load(i, &k, __ATOMIC_SEQ_CST); return j+k; } $ ./riscv32-unknown-elf-gcc -march=rv32ia foo.c -O1 -S -o - .file "foo.c" .option nopic .text .align 2 .globl atomic .type atomic, @function atomic: addi sp,sp,-16 sw ra,12(sp) sw s0,8(sp) mv s0,a0 li a2,5 li a1,1 call __atomic_fetch_add_1 addi a0,a0,1 andi a0,a0,0xff fence iorw,iorw lbu a5,0(s0) fence iorw,iorw add a0,a0,a5 andi a0,a0,0xff lw ra,12(sp) lw s0,8(sp) addi sp,sp,16 jr ra .size atomic, .-atomic .ident "GCC: (GNU) 9.0.0 20180530 (experimental)"