[Bug target/86005] [RISCV] Invalid intermixing of __atomic_* libcalls and inline atomic instruction sequences

asb at lowrisc dot org gcc-bugzilla@gcc.gnu.org
Thu May 31 05:40:00 GMT 2018


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)"


More information about the Gcc-bugs mailing list