-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Take advantage of assume
s on x * x
(with nuw
)
#122412
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
We can perform this optimization in CVP/SCCP. |
Hi! This issue may be a good introductory issue for people new to working on LLVM. If you would like to work on this issue, your first steps are:
If you have any further questions about this issue, don't hesitate to ask via a comment in the thread below. |
@llvm/issue-subscribers-good-first-issue Author: None (scottmcm)
Rust stabilized its [`isqrt`](https://doc.rust-lang.org/nightly/std/primitive.u16.html#method.isqrt) method [today](https://blog.rust-lang.org/2025/01/09/Rust-1.84.0.html#stabilized-apis), so I was looking at its codegen.
The output for let root = u16::isqrt(num); currently has a manual
I was thinking that it'd be nice to give LLVM a bit more specific information, like
since that's (a partial) definition of what Sadly, that assume today doesn't seem to be worth bothering adding, since But Alive2 confirms that it would be allowed to <https://alive2.llvm.org/ce/z/ko8HYR> define i1 @<!-- -->src(i16 noundef %num, i16 noundef %s) noundef zeroext {
start:
%_4 = mul nuw i16 noundef %s, noundef %s
%cond = icmp ule i16 %_4, noundef %num
assume i1 %cond
%_0 = icmp ult i16 noundef %s, 256
ret i1 %_0
}
=>
define i1 @<!-- -->tgt(i16 noundef %num, i16 noundef %s) noundef zeroext {
start:
ret i1 1
}
Transformation seems to be correct! Original Rust code I used to get the LLVM IR: <https://rust.godbolt.org/z/vM8qj4xjf> pub unsafe fn isqrt_facts(num: u16, s: u16) -> bool {
std::hint::assert_unchecked(u16::unchecked_mul(s, s) <= num);
s <= 255
} |
@dtcxzyw If you could assign this to me, going to take a stab at it. |
Rust stabilized its
isqrt
method today, so I was looking at its codegen.The output for
currently has a manual
I was thinking that it'd be nice to give LLVM a bit more specific information, like
since that's (a partial) definition of what
isqrt
does, and strictly more specific.Sadly, that assume today doesn't seem to be worth bothering adding, since
opt
seems like it doesn't take advantage of it even in a "simple" situation that doesn't need to know anything aboutnum
: https://llvm.godbolt.org/z/zoq4T5fKrBut Alive2 confirms that it would be allowed to https://alive2.llvm.org/ce/z/ko8HYR
Original Rust code I used to get the LLVM IR: https://rust.godbolt.org/z/vM8qj4xjf
cc rust-lang/rust#116226
The text was updated successfully, but these errors were encountered: