@@ -223,6 +223,36 @@ define i1 @is_pow2_non_zero_eq_1(i32 %x) {
223223 ret i1 %cmp
224224}
225225
226+ define i1 @is_pow2_non_zero_ugt_1 (i32 %x ) {
227+ ; CHECK-LABEL: @is_pow2_non_zero_ugt_1(
228+ ; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X:%.*]], 0
229+ ; CHECK-NEXT: call void @llvm.assume(i1 [[NOTZERO]])
230+ ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X]]), !range [[RNG0]]
231+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[T0]], 1
232+ ; CHECK-NEXT: ret i1 [[CMP]]
233+ ;
234+ %notzero = icmp ne i32 %x , 0
235+ call void @llvm.assume (i1 %notzero )
236+ %t0 = tail call i32 @llvm.ctpop.i32 (i32 %x )
237+ %cmp = icmp ugt i32 %t0 , 1
238+ ret i1 %cmp
239+ }
240+
241+ define i1 @is_pow2_non_zero_ne_1 (i32 %x ) {
242+ ; CHECK-LABEL: @is_pow2_non_zero_ne_1(
243+ ; CHECK-NEXT: [[NOTZERO:%.*]] = icmp ne i32 [[X:%.*]], 0
244+ ; CHECK-NEXT: call void @llvm.assume(i1 [[NOTZERO]])
245+ ; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X]]), !range [[RNG0]]
246+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[T0]], 1
247+ ; CHECK-NEXT: ret i1 [[CMP]]
248+ ;
249+ %notzero = icmp ne i32 %x , 0
250+ call void @llvm.assume (i1 %notzero )
251+ %t0 = tail call i32 @llvm.ctpop.i32 (i32 %x )
252+ %cmp = icmp ne i32 %t0 , 1
253+ ret i1 %cmp
254+ }
255+
226256define i1 @is_pow2_ctpop_logical (i32 %x ) {
227257; CHECK-LABEL: @is_pow2_ctpop_logical(
228258; CHECK-NEXT: [[T0:%.*]] = tail call i32 @llvm.ctpop.i32(i32 [[X:%.*]]), !range [[RNG0]]
0 commit comments