Issue 137736
Summary [RISCV] `clang` permits invalid operand for `Zclsd` instructions in inline assembly when using any optimization level other than `-O0`
Labels
Assignees
Reporter thebigclub
    The `Zclsd` [extension](https://github.com/riscv/riscv-isa-manual/blob/main/src/zilsd.adoc) requires the use of registers in the range of `x8-15` for `c.ld` and `c.sd` instructions. `clang` will use an invalid register when the compiler is free to choose the destination. This occurs for both the `I` and `E` base ISAs:

```bash
$ cat << EOF > test.c
#include <stdint.h>

int fn(void *arg1, int arg2, int arg3, int arg4, int arg5) {
        uint64_t val;

 asm volatile ("c.ld %0, 0(%1)"
                      : "=R" (val)
 : "r" (arg1)
        );

        return val + arg2 + arg3 + arg4 + arg5;
}
EOF
$ for isa in i e; do for level in 0 1 2 3 s z; do (set -x; clang -march=rv32"$isa"_zclsd -O"$level" -c test.c); echo Return value: $?; done; done
+ clang -march=rv32i_zclsd -O0 -c test.c
Return value: 0
+ clang -march=rv32i_zclsd -O1 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld a6, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32i_zclsd -O2 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 |         asm volatile ("c.ld %0, 0(%1)"
      | ^
<inline asm>:1:7: note: instantiated into assembly here
 1 |         c.ld a6, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32i_zclsd -O3 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld a6, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32i_zclsd -Os -c test.c
test.c:6:23: error: invalid operand for instruction
    6 |         asm volatile ("c.ld %0, 0(%1)"
      | ^
<inline asm>:1:7: note: instantiated into assembly here
 1 |         c.ld a6, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32i_zclsd -Oz -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld a6, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32e_zclsd -O0 -c test.c
Return value: 0
+ clang -march=rv32e_zclsd -O1 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      | ^
<inline asm>:1:7: note: instantiated into assembly here
    1 | c.ld t1, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32e_zclsd -O2 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 |         asm volatile ("c.ld %0, 0(%1)"
 |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld t1, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32e_zclsd -O3 -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld t1, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32e_zclsd -Os -c test.c
test.c:6:23: error: invalid operand for instruction
    6 |         asm volatile ("c.ld %0, 0(%1)"
      | ^
<inline asm>:1:7: note: instantiated into assembly here
 1 |         c.ld t1, 0(a0)
      |              ^
1 error generated.
Return value: 1
+ clang -march=rv32e_zclsd -Oz -c test.c
test.c:6:23: error: invalid operand for instruction
    6 | asm volatile ("c.ld %0, 0(%1)"
      |                       ^
<inline asm>:1:7: note: instantiated into assembly here
    1 |         c.ld t1, 0(a0)
      |              ^
1 error generated.
Return value: 1
$ clang -v
clang version 21.0.0git (https://github.com/llvm/llvm-project.git 913dcf1aa36f3ea2d67a0d2b05b9d1375987e553)
Target: riscv32-unknown-unknown-elf
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to