Issue |
134028
|
Summary |
Use `range` parameter attributes to fold `sub`+`icmp u*` into `icmp s*`
|
Labels |
new issue
|
Assignees |
|
Reporter |
scottmcm
|
(This example comes from looking at Rust's discriminant code from <https://rust.godbolt.org/z/1138aGqdb>)
Take this input IR:
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr {
start:
%0 = sub i8 %x, 2
%1 = zext i8 %0 to i64
%2 = icmp ule i8 %0, 2
%3 = add i64 %1, 1
%_2 = select i1 %2, i64 %3, i64 0
%_0 = icmp eq i64 %_2, 0
ret i1 %_0
}
```
Today, LLVM does simplify it a bunch, getting it down to <https://llvm.godbolt.org/z/G7as7Y6o5>
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr #0 {
%0 = add nsw i8 %x, -5
%1 = icmp ult i8 %0, -3
ret i1 %1
}
```
It could do better, though. The range information *was* used to determine the `nsw`, but that doesn't really help the *unsigned* `icmp`.
Specifically, the `range` restriction is enough that it'd be allowed to be just <https://alive2.llvm.org/ce/z/fkVEwL>
```llvm
define noundef zeroext i1 @is_foo(i8 noundef range(i8 -1, 5) %x) unnamed_addr #0 {
start:
%1 = icmp slt i8 %x, 2
ret i1 %1
}
```
Eliminating the need for the `add` altogether.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs