Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previously, rustc didn't inline
Limb::bitand
inside functions such asUInt::add_mod
andUInt::sub_mod
, when calling them from a different crate. This is probably because non-generic functions withoutinline
attribute don't get inlined across crates (unless using link-time optimization).Here's the assembly that shows this:
Assembly generated for U256::sub_mod before this commit
Assembly generated for U256::sub_mod after this commit
I benchmarked
U256::add_mod
andU256::sub_mod
before and after this commit using criterion-rs on Intel Core i7-8565U @ 1.80GHz and obtained the following average times. Note that I used aconst
modulus known at compile-time, which enables some compiler optimizations after inlining. With a modulus known only at runtime, times might differ.U256::add_mod
U256::sub_mod