Skip to content

Commit 095d49d

Browse files
authored
[InstCombine] Set samesign when converting signed predicates into unsigned (#112642)
Alive2: https://alive2.llvm.org/ce/z/6cqdt-
1 parent 370fd74 commit 095d49d

39 files changed

+274
-270
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6771,11 +6771,15 @@ Instruction *InstCombinerImpl::foldICmpUsingKnownBits(ICmpInst &I) {
67716771
}
67726772

67736773
// Turn a signed comparison into an unsigned one if both operands are known to
6774-
// have the same sign.
6775-
if (I.isSigned() &&
6774+
// have the same sign. Set samesign if possible (except for equality
6775+
// predicates).
6776+
if ((I.isSigned() || (I.isUnsigned() && !I.hasSameSign())) &&
67766777
((Op0Known.Zero.isNegative() && Op1Known.Zero.isNegative()) ||
6777-
(Op0Known.One.isNegative() && Op1Known.One.isNegative())))
6778-
return new ICmpInst(I.getUnsignedPredicate(), Op0, Op1);
6778+
(Op0Known.One.isNegative() && Op1Known.One.isNegative()))) {
6779+
I.setPredicate(I.getUnsignedPredicate());
6780+
I.setSameSign();
6781+
return &I;
6782+
}
67796783

67806784
return nullptr;
67816785
}

llvm/test/Analysis/ValueTracking/non-negative-phi-bits.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ define void @test() #0 {
88
; CHECK: for.body:
99
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ]
1010
; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
11-
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ult i64 [[INDVARS_IV]], 39
11+
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp samesign ult i64 [[INDVARS_IV]], 39
1212
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END:%.*]], label [[FOR_BODY]]
1313
; CHECK: for.end:
1414
; CHECK-NEXT: ret void

llvm/test/Transforms/InstCombine/call-guard.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ define void @test_guard_adjacent_diff_cond2(i32 %V1, i32 %V2) {
4343
; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[V1:%.*]], [[V2:%.*]]
4444
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0
4545
; CHECK-NEXT: [[AND:%.*]] = and i32 [[V1]], 255
46-
; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[AND]], 129
46+
; CHECK-NEXT: [[C:%.*]] = icmp samesign ult i32 [[AND]], 129
4747
; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[C]]
4848
; CHECK-NEXT: call void (i1, ...) @llvm.experimental.guard(i1 [[TMP3]], i32 123) [ "deopt"() ]
4949
; CHECK-NEXT: ret void

llvm/test/Transforms/InstCombine/cast_phi.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2-
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
2+
; RUN: opt < %s -passes="instcombine<no-verify-fixpoint>" -S | FileCheck %s
33

44
target datalayout = "n32:64"
55

llvm/test/Transforms/InstCombine/cmp-intrinsic.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ define i1 @cttz_ugt_other_multiuse_i33(i33 %x, ptr %p) {
386386
; CHECK-LABEL: @cttz_ugt_other_multiuse_i33(
387387
; CHECK-NEXT: [[TZ:%.*]] = tail call range(i33 0, 34) i33 @llvm.cttz.i33(i33 [[X:%.*]], i1 false)
388388
; CHECK-NEXT: store i33 [[TZ]], ptr [[P:%.*]], align 4
389-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i33 [[TZ]], 16
389+
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ugt i33 [[TZ]], 16
390390
; CHECK-NEXT: ret i1 [[CMP]]
391391
;
392392
%tz = tail call i33 @llvm.cttz.i33(i33 %x, i1 false)
@@ -430,7 +430,7 @@ define <2 x i1> @cttz_ult_other_multiuse_v2i32(<2 x i32> %x, ptr %p) {
430430
; CHECK-LABEL: @cttz_ult_other_multiuse_v2i32(
431431
; CHECK-NEXT: [[TZ:%.*]] = tail call range(i32 0, 33) <2 x i32> @llvm.cttz.v2i32(<2 x i32> [[X:%.*]], i1 false)
432432
; CHECK-NEXT: store <2 x i32> [[TZ]], ptr [[P:%.*]], align 8
433-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[TZ]], <i32 16, i32 16>
433+
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult <2 x i32> [[TZ]], <i32 16, i32 16>
434434
; CHECK-NEXT: ret <2 x i1> [[CMP]]
435435
;
436436
%tz = tail call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %x, i1 false)

llvm/test/Transforms/InstCombine/fold-ctpop-of-not.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ define i1 @fold_cmp_ult_ctpop_c(i8 %x, i8 %y, i1 %cond) {
160160
; CHECK-NEXT: [[TMP1:%.*]] = sub i8 -16, [[Y:%.*]]
161161
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
162162
; CHECK-NEXT: [[TMP3:%.*]] = call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[TMP2]])
163-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[TMP3]], 3
163+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i8 [[TMP3]], 3
164164
; CHECK-NEXT: ret i1 [[R]]
165165
;
166166
%nx = xor i8 %x, -1
@@ -176,7 +176,7 @@ define i1 @fold_cmp_sle_ctpop_c(i8 %x, i8 %y, i1 %cond) {
176176
; CHECK-NEXT: [[TMP1:%.*]] = sub i8 -16, [[Y:%.*]]
177177
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[COND:%.*]], i8 [[X:%.*]], i8 [[TMP1]]
178178
; CHECK-NEXT: [[TMP3:%.*]] = call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[TMP2]])
179-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[TMP3]], 4
179+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i8 [[TMP3]], 4
180180
; CHECK-NEXT: ret i1 [[R]]
181181
;
182182
%nx = xor i8 %x, -1
@@ -191,7 +191,7 @@ define i1 @fold_cmp_ult_ctpop_c_no_not_inst_save_fail(i8 %x) {
191191
; CHECK-LABEL: @fold_cmp_ult_ctpop_c_no_not_inst_save_fail(
192192
; CHECK-NEXT: [[NX:%.*]] = xor i8 [[X:%.*]], -2
193193
; CHECK-NEXT: [[CNT:%.*]] = call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 [[NX]])
194-
; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[CNT]], 5
194+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ult i8 [[CNT]], 5
195195
; CHECK-NEXT: ret i1 [[R]]
196196
;
197197
%nx = xor i8 %x, -2
@@ -203,7 +203,7 @@ define i1 @fold_cmp_ult_ctpop_c_no_not_inst_save_fail(i8 %x) {
203203
define <2 x i1> @fold_cmp_ugt_ctpop_c(<2 x i8> %x) {
204204
; CHECK-LABEL: @fold_cmp_ugt_ctpop_c(
205205
; CHECK-NEXT: [[TMP1:%.*]] = call range(i8 0, 9) <2 x i8> @llvm.ctpop.v2i8(<2 x i8> [[X:%.*]])
206-
; CHECK-NEXT: [[R:%.*]] = icmp ult <2 x i8> [[TMP1]], <i8 0, i8 2>
206+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ult <2 x i8> [[TMP1]], <i8 0, i8 2>
207207
; CHECK-NEXT: ret <2 x i1> [[R]]
208208
;
209209
%nx = xor <2 x i8> %x, <i8 -1, i8 -1>
@@ -216,7 +216,7 @@ define <2 x i1> @fold_cmp_ugt_ctpop_c_out_of_range_fail(<2 x i8> %x) {
216216
; CHECK-LABEL: @fold_cmp_ugt_ctpop_c_out_of_range_fail(
217217
; CHECK-NEXT: [[NX:%.*]] = xor <2 x i8> [[X:%.*]], <i8 -1, i8 -1>
218218
; CHECK-NEXT: [[CNT:%.*]] = call range(i8 0, 9) <2 x i8> @llvm.ctpop.v2i8(<2 x i8> [[NX]])
219-
; CHECK-NEXT: [[R:%.*]] = icmp ugt <2 x i8> [[CNT]], <i8 2, i8 10>
219+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt <2 x i8> [[CNT]], <i8 2, i8 10>
220220
; CHECK-NEXT: ret <2 x i1> [[R]]
221221
;
222222
%nx = xor <2 x i8> %x, <i8 -1, i8 -1>

llvm/test/Transforms/InstCombine/fold-log2-ceil-idiom.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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]]

llvm/test/Transforms/InstCombine/gep-combine-loop-invariant.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ define float @gep_cross_loop(ptr %_arg_, ptr %_arg_3, float %_arg_8) {
217217
; CHECK: for.cond.i:
218218
; CHECK-NEXT: [[IDX:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[ADD11_I:%.*]], [[FOR_BODY_I:%.*]] ]
219219
; CHECK-NEXT: [[SUM:%.*]] = phi float [ 0.000000e+00, [[ENTRY]] ], [ [[ADD_I:%.*]], [[FOR_BODY_I]] ]
220-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IDX]], 17
220+
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[IDX]], 17
221221
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY_I]], label [[FOR_COND_I_I_I_PREHEADER:%.*]]
222222
; CHECK: for.cond.i.i.i.preheader:
223223
; CHECK-NEXT: ret float [[SUM]]

llvm/test/Transforms/InstCombine/icmp-mul-zext.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ define i32 @sterix(i32, i8, i64) {
1313
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[MUL]], [[SH_PROM]]
1414
; CHECK-NEXT: [[CONV2:%.*]] = zext i32 [[SHR]] to i64
1515
; CHECK-NEXT: [[MUL3:%.*]] = mul nuw nsw i64 [[CONV]], [[CONV2]]
16-
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp ult i64 [[MUL3]], 4294967296
16+
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp samesign ult i64 [[MUL3]], 4294967296
1717
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[LOR_RHS:%.*]], label [[LOR_END:%.*]]
1818
; CHECK: lor.rhs:
1919
; CHECK-NEXT: [[AND:%.*]] = and i64 [[TMP2]], [[MUL3]]

llvm/test/Transforms/InstCombine/icmp-mul.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -849,7 +849,7 @@ define i1 @not_mul_of_bool(i32 %x, i8 %y) {
849849
; CHECK-NEXT: [[Q:%.*]] = and i32 [[X:%.*]], 3
850850
; CHECK-NEXT: [[Z:%.*]] = zext i8 [[Y:%.*]] to i32
851851
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Q]], [[Z]]
852-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 255
852+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i32 [[M]], 255
853853
; CHECK-NEXT: ret i1 [[R]]
854854
;
855855
%q = and i32 %x, 3
@@ -866,7 +866,7 @@ define i1 @not_mul_of_bool_commute(i32 %x, i32 %y) {
866866
; CHECK-NEXT: [[X30:%.*]] = lshr i32 [[X:%.*]], 30
867867
; CHECK-NEXT: [[Y8:%.*]] = and i32 [[Y:%.*]], 255
868868
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Y8]], [[X30]]
869-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 255
869+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i32 [[M]], 255
870870
; CHECK-NEXT: ret i1 [[R]]
871871
;
872872
%x30 = lshr i32 %x, 30
@@ -935,7 +935,7 @@ define i1 @not_mul_of_pow2(i32 %x, i8 %y) {
935935
; CHECK-NEXT: [[Q:%.*]] = and i32 [[X:%.*]], 6
936936
; CHECK-NEXT: [[Z:%.*]] = zext i8 [[Y:%.*]] to i32
937937
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Q]], [[Z]]
938-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 1530
938+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i32 [[M]], 1530
939939
; CHECK-NEXT: ret i1 [[R]]
940940
;
941941
%q = and i32 %x, 6
@@ -952,7 +952,7 @@ define i1 @not_mul_of_pow2_commute(i32 %x, i32 %y) {
952952
; CHECK-NEXT: [[X30:%.*]] = and i32 [[X:%.*]], 12
953953
; CHECK-NEXT: [[Y8:%.*]] = and i32 [[Y:%.*]], 255
954954
; CHECK-NEXT: [[M:%.*]] = mul nuw nsw i32 [[Y8]], [[X30]]
955-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[M]], 3060
955+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i32 [[M]], 3060
956956
; CHECK-NEXT: ret i1 [[R]]
957957
;
958958
%x30 = and i32 %x, 12

llvm/test/Transforms/InstCombine/icmp-ne-pow2.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ define i32 @not_pow2_32_nonconst_assume(i32 %x, i32 %y) {
350350
define i32 @pow2_or_zero_32_nonconst_assume(i32 %x, i32 %y) {
351351
; CHECK-LABEL: @pow2_or_zero_32_nonconst_assume(
352352
; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])
353-
; CHECK-NEXT: [[YP2:%.*]] = icmp ult i32 [[CTPOP]], 2
353+
; CHECK-NEXT: [[YP2:%.*]] = icmp samesign ult i32 [[CTPOP]], 2
354354
; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])
355355
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]
356356
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
@@ -426,7 +426,7 @@ False:
426426
define i32 @pow2_or_zero_32_nonconst_assume_br(i32 %x, i32 %y) {
427427
; CHECK-LABEL: @pow2_or_zero_32_nonconst_assume_br(
428428
; CHECK-NEXT: [[CTPOP:%.*]] = call range(i32 0, 33) i32 @llvm.ctpop.i32(i32 [[Y:%.*]])
429-
; CHECK-NEXT: [[YP2:%.*]] = icmp ult i32 [[CTPOP]], 2
429+
; CHECK-NEXT: [[YP2:%.*]] = icmp samesign ult i32 [[CTPOP]], 2
430430
; CHECK-NEXT: call void @llvm.assume(i1 [[YP2]])
431431
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], [[Y]]
432432
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0

llvm/test/Transforms/InstCombine/icmp-of-trunc-ext.ll

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ define i1 @icmp_trunc_x_trunc_y_2_illegal_anyways(i33 %x, i63 %y) {
7070
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
7171
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_LB_ONLY]])
7272
; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i33 [[X]] to i63
73-
; CHECK-NEXT: [[R:%.*]] = icmp ult i63 [[Y]], [[TMP1]]
73+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ult i63 [[Y]], [[TMP1]]
7474
; CHECK-NEXT: ret i1 [[R]]
7575
;
7676
%x_lb_only = icmp ult i33 %x, 512
@@ -90,7 +90,7 @@ define i1 @icmp_trunc_x_trunc_y_3(i64 %x, i32 %y) {
9090
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
9191
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_LB_ONLY]])
9292
; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw nsw i64 [[X]] to i32
93-
; CHECK-NEXT: [[R:%.*]] = icmp ule i32 [[Y]], [[TMP1]]
93+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ule i32 [[Y]], [[TMP1]]
9494
; CHECK-NEXT: ret i1 [[R]]
9595
;
9696
%x_lb_only = icmp ult i64 %x, 123
@@ -152,7 +152,7 @@ define i1 @icmp_trunc_x_trunc_y_swap0(i33 %x, i32 %y) {
152152
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
153153
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_LB_ONLY]])
154154
; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw nsw i33 [[X]] to i32
155-
; CHECK-NEXT: [[R:%.*]] = icmp uge i32 [[Y]], [[TMP1]]
155+
; CHECK-NEXT: [[R:%.*]] = icmp samesign uge i32 [[Y]], [[TMP1]]
156156
; CHECK-NEXT: ret i1 [[R]]
157157
;
158158
%x_lb_only = icmp ult i33 %x, 65536
@@ -172,7 +172,7 @@ define i1 @icmp_trunc_x_trunc_y_swap1(i33 %x, i32 %y) {
172172
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
173173
; CHECK-NEXT: call void @llvm.assume(i1 [[Y_LB_ONLY]])
174174
; CHECK-NEXT: [[TMP1:%.*]] = trunc nuw nsw i33 [[X]] to i32
175-
; CHECK-NEXT: [[R:%.*]] = icmp ule i32 [[Y]], [[TMP1]]
175+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ule i32 [[Y]], [[TMP1]]
176176
; CHECK-NEXT: ret i1 [[R]]
177177
;
178178
%x_lb_only = icmp ult i33 %x, 65536
@@ -190,7 +190,7 @@ define i1 @icmp_trunc_x_zext_y(i32 %x, i8 %y) {
190190
; CHECK-NEXT: [[X_LB_ONLY:%.*]] = icmp ult i32 [[X:%.*]], 65536
191191
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
192192
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[Y:%.*]] to i32
193-
; CHECK-NEXT: [[R:%.*]] = icmp ugt i32 [[X]], [[TMP1]]
193+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ugt i32 [[X]], [[TMP1]]
194194
; CHECK-NEXT: ret i1 [[R]]
195195
;
196196
%x_lb_only = icmp ult i32 %x, 65536
@@ -206,7 +206,7 @@ define i1 @icmp_trunc_x_zext_y_2(i32 %x, i8 %y) {
206206
; CHECK-NEXT: [[X_LB_ONLY:%.*]] = icmp ult i32 [[X:%.*]], 65536
207207
; CHECK-NEXT: call void @llvm.assume(i1 [[X_LB_ONLY]])
208208
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[Y:%.*]] to i32
209-
; CHECK-NEXT: [[R:%.*]] = icmp ule i32 [[X]], [[TMP1]]
209+
; CHECK-NEXT: [[R:%.*]] = icmp samesign ule i32 [[X]], [[TMP1]]
210210
; CHECK-NEXT: ret i1 [[R]]
211211
;
212212
%x_lb_only = icmp ult i32 %x, 65536

llvm/test/Transforms/InstCombine/icmp-range.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ define i1 @test_two_ranges(ptr nocapture readonly %arg1, ptr nocapture readonly
140140
; CHECK-LABEL: @test_two_ranges(
141141
; CHECK-NEXT: [[VAL1:%.*]] = load i32, ptr [[ARG1:%.*]], align 4, !range [[RNG4:![0-9]+]]
142142
; CHECK-NEXT: [[VAL2:%.*]] = load i32, ptr [[ARG2:%.*]], align 4, !range [[RNG5:![0-9]+]]
143-
; CHECK-NEXT: [[RVAL:%.*]] = icmp ult i32 [[VAL2]], [[VAL1]]
143+
; CHECK-NEXT: [[RVAL:%.*]] = icmp samesign ult i32 [[VAL2]], [[VAL1]]
144144
; CHECK-NEXT: ret i1 [[RVAL]]
145145
;
146146
%val1 = load i32, ptr %arg1, !range !5
@@ -152,7 +152,7 @@ define i1 @test_two_ranges(ptr nocapture readonly %arg1, ptr nocapture readonly
152152
; Values' ranges overlap each other, so it can not be simplified.
153153
define i1 @test_two_attribute_ranges(i32 range(i32 5, 10) %arg1, i32 range(i32 8, 16) %arg2) {
154154
; CHECK-LABEL: @test_two_attribute_ranges(
155-
; CHECK-NEXT: [[RVAL:%.*]] = icmp ult i32 [[ARG2:%.*]], [[ARG1:%.*]]
155+
; CHECK-NEXT: [[RVAL:%.*]] = icmp samesign ult i32 [[ARG2:%.*]], [[ARG1:%.*]]
156156
; CHECK-NEXT: ret i1 [[RVAL]]
157157
;
158158
%rval = icmp ult i32 %arg2, %arg1
@@ -215,7 +215,7 @@ define <2 x i1> @test_two_ranges_vec(ptr nocapture readonly %arg1, ptr nocapture
215215
; CHECK-LABEL: @test_two_ranges_vec(
216216
; CHECK-NEXT: [[VAL1:%.*]] = load <2 x i32>, ptr [[ARG1:%.*]], align 8, !range [[RNG4]]
217217
; CHECK-NEXT: [[VAL2:%.*]] = load <2 x i32>, ptr [[ARG2:%.*]], align 8, !range [[RNG5]]
218-
; CHECK-NEXT: [[RVAL:%.*]] = icmp ult <2 x i32> [[VAL2]], [[VAL1]]
218+
; CHECK-NEXT: [[RVAL:%.*]] = icmp samesign ult <2 x i32> [[VAL2]], [[VAL1]]
219219
; CHECK-NEXT: ret <2 x i1> [[RVAL]]
220220
;
221221
%val1 = load <2 x i32>, ptr %arg1, !range !5
@@ -249,7 +249,7 @@ define <2 x i1> @test_two_ranges_vec_true(ptr nocapture readonly %arg1, ptr noca
249249
; Values' ranges overlap each other, so it can not be simplified.
250250
define <2 x i1> @test_two_argument_ranges_vec(<2 x i32> range(i32 5, 10) %arg1, <2 x i32> range(i32 8, 16) %arg2) {
251251
; CHECK-LABEL: @test_two_argument_ranges_vec(
252-
; CHECK-NEXT: [[RVAL:%.*]] = icmp ult <2 x i32> [[ARG2:%.*]], [[ARG1:%.*]]
252+
; CHECK-NEXT: [[RVAL:%.*]] = icmp samesign ult <2 x i32> [[ARG2:%.*]], [[ARG1:%.*]]
253253
; CHECK-NEXT: ret <2 x i1> [[RVAL]]
254254
;
255255
%rval = icmp ult <2 x i32> %arg2, %arg1
@@ -283,7 +283,7 @@ define i1 @test_two_return_attribute_ranges_not_simplified() {
283283
; CHECK-LABEL: @test_two_return_attribute_ranges_not_simplified(
284284
; CHECK-NEXT: [[VAL1:%.*]] = call range(i32 5, 10) i32 @create_range1()
285285
; CHECK-NEXT: [[VAL2:%.*]] = call i32 @create_range2()
286-
; CHECK-NEXT: [[RVAL:%.*]] = icmp ult i32 [[VAL2]], [[VAL1]]
286+
; CHECK-NEXT: [[RVAL:%.*]] = icmp samesign ult i32 [[VAL2]], [[VAL1]]
287287
; CHECK-NEXT: ret i1 [[RVAL]]
288288
;
289289
%val1 = call range(i32 5, 10) i32 @create_range1()

0 commit comments

Comments
 (0)