@@ -118,7 +118,7 @@ define i32 @log2_ceil_idiom_x_may_be_zero(i32 %x) {
118118; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X]], i1 false)
119119; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 31
120120; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
121- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
121+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
122122; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
123123; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
124124; CHECK-NEXT: ret i32 [[RET]]
@@ -139,7 +139,7 @@ define i4 @log2_ceil_idiom_trunc_too_short(i32 %x) {
139139; CHECK-NEXT: [[TRUNC:%.*]] = trunc i32 [[CTLZ]] to i4
140140; CHECK-NEXT: [[XOR:%.*]] = xor i4 [[TRUNC]], -1
141141; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
142- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
142+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
143143; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i4
144144; CHECK-NEXT: [[RET:%.*]] = add i4 [[XOR]], [[ZEXT]]
145145; CHECK-NEXT: ret i4 [[RET]]
@@ -160,7 +160,7 @@ define i32 @log2_ceil_idiom_mismatched_operands(i32 %x, i32 %y) {
160160; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X]], i1 true)
161161; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 31
162162; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y]])
163- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
163+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
164164; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
165165; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
166166; CHECK-NEXT: ret i32 [[RET]]
@@ -180,7 +180,7 @@ define i32 @log2_ceil_idiom_wrong_constant(i32 %x) {
180180; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X]], i1 true)
181181; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 30
182182; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
183- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
183+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
184184; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
185185; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
186186; CHECK-NEXT: ret i32 [[RET]]
@@ -220,7 +220,7 @@ define i32 @log2_ceil_idiom_not_a_power2_test2(i32 %x) {
220220; CHECK-NEXT: [[CTLZ:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctlz.i32(i32 [[X]], i1 true)
221221; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 31
222222; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
223- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 2
223+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 2
224224; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
225225; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
226226; CHECK-NEXT: ret i32 [[RET]]
@@ -241,7 +241,7 @@ define i32 @log2_ceil_idiom_multiuse2(i32 %x) {
241241; CHECK-NEXT: call void @use32(i32 [[CTLZ]])
242242; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 31
243243; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
244- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
244+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
245245; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
246246; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
247247; CHECK-NEXT: ret i32 [[RET]]
@@ -263,7 +263,7 @@ define i32 @log2_ceil_idiom_multiuse3(i32 %x) {
263263; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[CTLZ]], 31
264264; CHECK-NEXT: call void @use32(i32 [[XOR]])
265265; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
266- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
266+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
267267; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i32
268268; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i32 [[XOR]], [[ZEXT]]
269269; CHECK-NEXT: ret i32 [[RET]]
@@ -286,7 +286,7 @@ define i5 @log2_ceil_idiom_trunc_multiuse4(i32 %x) {
286286; CHECK-NEXT: call void @use5(i5 [[TRUNC]])
287287; CHECK-NEXT: [[XOR:%.*]] = xor i5 [[TRUNC]], -1
288288; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
289- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
289+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
290290; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i5
291291; CHECK-NEXT: [[RET:%.*]] = add i5 [[XOR]], [[ZEXT]]
292292; CHECK-NEXT: ret i5 [[RET]]
@@ -310,7 +310,7 @@ define i64 @log2_ceil_idiom_zext_multiuse5(i32 %x) {
310310; CHECK-NEXT: [[EXT:%.*]] = zext nneg i32 [[XOR]] to i64
311311; CHECK-NEXT: call void @use64(i64 [[EXT]])
312312; CHECK-NEXT: [[CTPOP:%.*]] = tail call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[X]])
313- ; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[CTPOP]], 1
313+ ; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i32 [[CTPOP]], 1
314314; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP]] to i64
315315; CHECK-NEXT: [[RET:%.*]] = add nuw nsw i64 [[EXT]], [[ZEXT]]
316316; CHECK-NEXT: ret i64 [[RET]]
0 commit comments