Open
Description
(This example comes from looking at Rust's discriminant code from https://rust.godbolt.org/z/1138aGqdb)
Take this input IR:
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
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
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.