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

Reply via email to