@@ -2746,32 +2746,39 @@ macro_rules! int_impl {
2746
2746
pub const fn pow( self , mut exp: u32 ) -> Self {
2747
2747
let mut base = self ;
2748
2748
2749
- // Unroll multiplications for small exponent values.
2750
- // This gives the optimizer a way to efficiently inline call sites
2751
- // for the most common use cases with constant exponents.
2752
- // Currently, LLVM is unable to unroll the loop below.
2753
- match exp {
2754
- 0 => return 1 ,
2755
- 1 => return base,
2756
- 2 => return base * base,
2757
- 3 => {
2758
- let squared = base * base;
2759
- return squared * base;
2760
- }
2761
- 4 => {
2762
- let squared = base * base;
2763
- return squared * squared;
2764
- }
2765
- 5 => {
2766
- let squared = base * base;
2767
- return squared * squared * base;
2749
+ if intrinsics:: is_val_statically_known( exp) {
2750
+ // Unroll multiplications for small exponent values.
2751
+ // This gives the optimizer a way to efficiently inline call sites
2752
+ // for the most common use cases with constant exponents.
2753
+ // Currently, LLVM is unable to unroll the loop below.
2754
+ match exp {
2755
+ 0 => return 1 ,
2756
+ 1 => return base,
2757
+ 2 => return base * base,
2758
+ 3 => {
2759
+ let squared = base * base;
2760
+ return squared * base;
2761
+ }
2762
+ 4 => {
2763
+ let squared = base * base;
2764
+ return squared * squared;
2765
+ }
2766
+ 5 => {
2767
+ let squared = base * base;
2768
+ return squared * squared * base;
2769
+ }
2770
+ 6 => {
2771
+ let cubed = base * base * base;
2772
+ return cubed * cubed;
2773
+ }
2774
+ _ => { }
2768
2775
}
2769
- 6 => {
2770
- let cubed = base * base * base ;
2771
- return cubed * cubed ;
2776
+ } else {
2777
+ if exp == 0 {
2778
+ return 1 ;
2772
2779
}
2773
- _ => { }
2774
2780
}
2781
+ debug_assert!( exp != 0 ) ;
2775
2782
2776
2783
let mut acc = 1 ;
2777
2784
0 commit comments