| Issue |
178588
|
| Summary |
[RISC-V] `bset rd, zero, rs` not generated for subtraction, only for addition
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
Arnavion
|
https://gcc.godbolt.org/z/KoffWenbG
```c
#include <stdint.h>
uint64_t bare(uint8_t b) {
return ((uint64_t) 1) << b;
}
uint64_t plus(uint64_t a, uint8_t b) {
return a + (((uint64_t) 1) << b);
}
uint64_t minus(uint64_t a, uint8_t b) {
return a - (((uint64_t) 1) << b);
}
```
`clang -O3 -march=rv64id_zbs` generates:
```asm
bare:
bset a0, zero, a0
ret
plus:
bset a1, zero, a1
add a0, a1, a0
ret
minus:
li a2, -1
sll a1, a2, a1
add a0, a1, a0
ret
```
`minus` could be:
```asm
bset a1, zero, a1
sub a0, a1, a0
ret
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs