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

Reply via email to