Tell LLVM about NonZero integer types#54995
Conversation
Change the `get` method on NonZero integer types to insert an `assume`, so that LLVM can optimize better. Closes rust-lang#54868
|
r? @dtolnay (rust_highfive has picked a reviewer for you, use r? to override) |
|
r? @eddyb |
| pub fn assume_nonzero(x: u64, y: NonZeroU64) -> u64 { | ||
| x / y.get() | ||
| // CHECK: icmp ne i64 %y, 0 | ||
| // CHECK: @llvm.assume |
There was a problem hiding this comment.
Would it be worth a CHECK-NOT of some sort that there's no branch/select/panic/whatever?
Also, cc @rkruppe who might have thoughts here.
There was a problem hiding this comment.
Yes, the assume is just a hint and might get removed at some stage of the pipeline in the future. Checking for lack of the branch is the more correct way to test this here.
|
I am hesitant to add assumes in random places because they add more IR (particularly if they're in a very common, small and usually-inlined function like this) and they can, unfortunately, also block some optimizations. |
I'd like to learn what optimization this could block. |
|
@tromey anything that would be blocked by a regular non-inlined call to an empty function is going to be blocked by the
In addition to that, the call to |
|
Besides passes treating |
|
The most appropriate way to solve this would be to assign the |
|
We already have range metadata on loads (there's no range metadata on stores). Without making NonZeroU32 a lang item, too -- it's a consequence of it being laid out as scalar and inheriting the niche from |
|
Thanks. |
…-obk Unstably allow assume intrinsic in const contexts Not sure much about this usage because there are concerns about [blocking optimization][1] and [slowing down LLVM][2] when using `assme` intrinsic in inline functions. But since Oli suggested in rust-lang#76960 (comment), here we are. [1]: rust-lang#54995 (comment) [2]: rust-lang#49572 (comment)
…-obk Unstably allow assume intrinsic in const contexts Not sure much about this usage because there are concerns about [blocking optimization][1] and [slowing down LLVM][2] when using `assme` intrinsic in inline functions. But since Oli suggested in rust-lang#76960 (comment), here we are. [1]: rust-lang#54995 (comment) [2]: rust-lang#49572 (comment)
Change the
getmethod on NonZero integer types to insert anassume, so that LLVM can optimize better.Closes #54868