Issue |
143259
|
Summary |
Failure to spot `scmp(x, 0)` idiom
|
Labels |
llvm:optimizations,
llvm:instcombine
|
Assignees |
|
Reporter |
Kmeakin
|
https://godbolt.org/z/1xqx65vds
For
```c
int signum(int x) {
if (x < 0) return -1;
if (x > 0) return +1;
return 0;
}
```
clang produces
```asm
signum:
cmp w0, #0
cset w8, ne
cmn w0, #1
csinv w0, w8, wzr, gt
ret
```
but GCC produces
```asm
signum:
cmp w0, 0
cset w0, ne
csinv w0, w0, wzr, ge
ret
```
It seems that LLVM is not recognising that `signum` is equivalent to `scmp(x, 0)`:
https://alive2.llvm.org/ce/z/EYQZwV
```llvm
define dso_local range(i32 -1, 2) i32 @src(i32 noundef %0) local_unnamed_addr #0 {
%2 = icmp ne i32 %0, 0
%3 = zext i1 %2 to i32
%4 = icmp sgt i32 %0, -1
%5 = select i1 %4, i32 %3, i32 -1
ret i32 %5
}
define dso_local range(i32 -1, 2) i32 @tgt(i32 noundef %0) local_unnamed_addr #0 {
%2 = tail call i32 @llvm.scmp(i32 %0, i32 0)
ret i32 %2
}
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs