11//@ compile-flags: -Copt-level=3
2+ //@ revisions: LLVM22 LLVM23
3+ //@ [LLVM22] max-llvm-major-version: 22
4+ //@ [LLVM23] min-llvm-version: 23
25// Test that `pow` can use a faster implementation when `base` is a
36// known power of two
47
@@ -21,11 +24,16 @@ pub fn pow2(exp: u32) -> u32 {
2124pub fn pow4 ( exp : u32 ) -> u32 {
2225 // CHECK: %[[ICMP1:.+]] = icmp slt i32 %exp, 0
2326 // CHECK: %[[SHIFT_AMOUNT:.+]] = shl i32 %exp, 1
24- // CHECK: %[[ICMP2:.+]] = icmp ult i32 %[[SHIFT_AMOUNT]], 32
25- // CHECK: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
26- // CHECK: %[[SEL:.+]] = select i1 %[[ICMP2]], i32 %[[POW]], i32 0
27- // CHECK: %[[RET:.+]] = select i1 %[[ICMP1]], i32 0, i32 %[[SEL]]
28- // CHECK: ret i32 %[[RET]]
27+ // LLVM22: %[[ICMP2:.+]] = icmp ult i32 %[[SHIFT_AMOUNT]], 32
28+ // LLVM22: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
29+ // LLVM22: %[[SEL:.+]] = select i1 %[[ICMP2]], i32 %[[POW]], i32 0
30+ // LLVM22: %[[RET:.+]] = select i1 %[[ICMP1]], i32 0, i32 %[[SEL]]
31+ // LLVM22: ret i32 %[[RET]]
32+ // LLVM23: %[[ICMP2:.+]] = icmp ugt i32 %[[SHIFT_AMOUNT]], 31
33+ // LLVM23: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
34+ // LLVM23: %[[COND:.+]] = or i1 %[[ICMP1]], %[[ICMP2]]
35+ // LLVM23: %[[RET:.+]] = select i1 %[[COND]], i32 0, i32 %[[POW]]
36+ // LLVM23: ret i32 %[[RET]]
2937 4u32 . pow ( exp)
3038}
3139
@@ -35,11 +43,16 @@ pub fn pow4(exp: u32) -> u32 {
3543pub fn pow16 ( exp : u32 ) -> u32 {
3644 // CHECK: %[[ICMP1:.+]] = icmp ugt i32 %exp, 1073741823
3745 // CHECK: %[[SHIFT_AMOUNT:.+]] = shl i32 %exp, 2
38- // CHECK: %[[ICMP2:.+]] = icmp ult i32 %[[SHIFT_AMOUNT]], 32
39- // CHECK: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
40- // CHECK: %[[SEL:.+]] = select i1 %[[ICMP2]], i32 %[[POW]], i32 0
41- // CHECK: %[[RET:.+]] = select i1 %[[ICMP1]], i32 0, i32 %[[SEL]]
42- // CHECK: ret i32 %[[RET]]
46+ // LLVM22: %[[ICMP2:.+]] = icmp ult i32 %[[SHIFT_AMOUNT]], 32
47+ // LLVM22: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
48+ // LLVM22: %[[SEL:.+]] = select i1 %[[ICMP2]], i32 %[[POW]], i32 0
49+ // LLVM22: %[[RET:.+]] = select i1 %[[ICMP1]], i32 0, i32 %[[SEL]]
50+ // LLVM22: ret i32 %[[RET]]
51+ // LLVM23: %[[ICMP2:.+]] = icmp ugt i32 %[[SHIFT_AMOUNT]], 31
52+ // LLVM23: %[[POW:.+]] = shl nuw i32 1, %[[SHIFT_AMOUNT]]
53+ // LLVM23: %[[COND:.+]] = or i1 %[[ICMP1]], %[[ICMP2]]
54+ // LLVM23: %[[RET:.+]] = select i1 %[[COND]], i32 0, i32 %[[POW]]
55+ // LLVM23: ret i32 %[[RET]]
4356 16u32 . pow ( exp)
4457}
4558
0 commit comments