Rollup merge of #145776 - ChaiTRex:ilog_specialization, r=joboet
Optimize `.ilog({2,10})` to `.ilog{2,10}()`
Optimize `.ilog({2,10})` to `.ilog{2,10}()`
Inform compiler of optimizations when the base is known at compile time and there's a cheaper method available:
* `{integer}.checked_ilog(2)` -> `{integer}.checked_ilog2()`
* `{integer}.checked_ilog(10)` -> `{integer}.checked_ilog10()`
* `{integer}.ilog(2)` -> `{integer}.ilog2()`
* `{integer}.ilog(10)` -> `{integer}.ilog10()`
This commit is contained in:
commit
dfbba07012
1 changed files with 14 additions and 0 deletions
|
|
@ -1491,6 +1491,20 @@ macro_rules! uint_impl {
|
|||
without modifying the original"]
|
||||
#[inline]
|
||||
pub const fn checked_ilog(self, base: Self) -> Option<u32> {
|
||||
// Inform compiler of optimizations when the base is known at
|
||||
// compile time and there's a cheaper method available.
|
||||
//
|
||||
// Note: Like all optimizations, this is not guaranteed to be
|
||||
// applied by the compiler. If you want those specific bases,
|
||||
// use `.checked_ilog2()` or `.checked_ilog10()` directly.
|
||||
if core::intrinsics::is_val_statically_known(base) {
|
||||
if base == 2 {
|
||||
return self.checked_ilog2();
|
||||
} else if base == 10 {
|
||||
return self.checked_ilog10();
|
||||
}
|
||||
}
|
||||
|
||||
if self <= 0 || base <= 1 {
|
||||
None
|
||||
} else if self < base {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue