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

Reply via email to