| Issue |
161036
|
| Summary |
[x86][armv8] Failure to use flag in unsigned underflow compare idiom
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
WalterKruger
|
It is a common idiom to check for unsigned underflow by doing a greater than compare between the difference and minuend:
```C
#include <stdint.h>
uint64_t subIfNoUnderflow_clang(uint64_t a, uint64_t b) {
uint64_t diff = a - b;
return (diff > a)? a : diff;
}
```
Instead of using the carry flag, which is set by the subtraction, clang emits a compare instruction:
https://godbolt.org/z/ex5554M6P
```asm
subIfNoUnderflow_clang:
mov rax, rdi
sub rax, rsi
cmp rax, rdi
cmovae rax, rdi
ret
```
Ideally it should produce:
```asm
subIfNoUnderflow_ideal:
mov rax, rdi
sub rax, rsi
cmovb rax, rdi
ret
```
# Related issues
#53432
#62696
#73847
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs