Skip to content

Commit fbcf8a8

Browse files
authored
[ConstraintElim] Add (UGE, var, 0) to unsigned system for new vars. (#76262)
The constraint system used for ConstraintElimination assumes all varibles to be signed. This can cause missed optimization in the unsigned system, due to missing the information that all variables are unsigned (non-negative). Variables can be marked as non-negative by adding Var >= 0 for all variables. This is done for arguments on ConstraintInfo construction and after adding new variables. This handles cases like the ones outlined in https://discourse.llvm.org/t/why-does-llvm-not-perform-range-analysis-on-integer-values/74341 The original example shared above is now handled without this change, but adding another variable means that instcombine won't be able to simplify examples like https://godbolt.org/z/hTnra7zdY Adding the extra variables comes with a slight compile-time increase https://llvm-compile-time-tracker.com/compare.php?from=7568b36a2bc1a1e496ec29246966ffdfc3a8b87f&to=641a47f0acce7755e340447386013a2e086f03d9&stat=instructions:u stage1-O3 stage1-ReleaseThinLTO stage1-ReleaseLTO-g stage1-O0-g +0.04% +0.07% +0.05% +0.02% stage2-O3 stage2-O0-g stage2-clang +0.05% +0.05% +0.05% #76262
1 parent ed6dc62 commit fbcf8a8

20 files changed

+90
-138
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,16 @@ class ConstraintInfo {
273273

274274
public:
275275
ConstraintInfo(const DataLayout &DL, ArrayRef<Value *> FunctionArgs)
276-
: UnsignedCS(FunctionArgs), SignedCS(FunctionArgs), DL(DL) {}
276+
: UnsignedCS(FunctionArgs), SignedCS(FunctionArgs), DL(DL) {
277+
auto &Value2Index = getValue2Index(false);
278+
// Add Arg > -1 constraints to unsigned system for all function arguments.
279+
for (Value *Arg : FunctionArgs) {
280+
ConstraintTy VarPos(SmallVector<int64_t, 8>(Value2Index.size() + 1, 0),
281+
false, false, false);
282+
VarPos.Coefficients[Value2Index[Arg]] = -1;
283+
UnsignedCS.addVariableRow(VarPos.Coefficients);
284+
}
285+
}
277286

278287
DenseMap<Value *, unsigned> &getValue2Index(bool Signed) {
279288
return Signed ? SignedCS.getValue2Index() : UnsignedCS.getValue2Index();
@@ -1466,6 +1475,17 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B,
14661475
DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
14671476
std::move(ValuesToRelease));
14681477

1478+
if (!R.IsSigned) {
1479+
for (Value *V : NewVariables) {
1480+
ConstraintTy VarPos(SmallVector<int64_t, 8>(Value2Index.size() + 1, 0),
1481+
false, false, false);
1482+
VarPos.Coefficients[Value2Index[V]] = -1;
1483+
CSToUse.addVariableRow(VarPos.Coefficients);
1484+
DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned,
1485+
SmallVector<Value *, 2>());
1486+
}
1487+
}
1488+
14691489
if (R.isEq()) {
14701490
// Also add the inverted constraint for equality constraints.
14711491
for (auto &Coeff : R.Coefficients)
@@ -1711,7 +1731,8 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI,
17111731
#ifndef NDEBUG
17121732
unsigned SignedEntries =
17131733
count_if(DFSInStack, [](const StackEntry &E) { return E.IsSigned; });
1714-
assert(Info.getCS(false).size() == DFSInStack.size() - SignedEntries &&
1734+
assert(Info.getCS(false).size() - FunctionArgs.size() ==
1735+
DFSInStack.size() - SignedEntries &&
17151736
"updates to CS and DFSInStack are out of sync");
17161737
assert(Info.getCS(true).size() == SignedEntries &&
17171738
"updates to CS and DFSInStack are out of sync");

llvm/test/Transforms/ConstraintElimination/add-nuw.ll

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,7 @@ define void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) {
235235
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]
236236
; CHECK-NEXT: call void @use(i1 true)
237237
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]
238-
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[ADD_2]], [[C]]
239-
; CHECK-NEXT: call void @use(i1 [[C_4]])
238+
; CHECK-NEXT: call void @use(i1 true)
240239
; CHECK-NEXT: ret void
241240
; CHECK: if.end:
242241
; CHECK-NEXT: ret void
@@ -278,14 +277,11 @@ define void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) {
278277
; CHECK-NEXT: br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
279278
; CHECK: if.then:
280279
; CHECK-NEXT: [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]]
281-
; CHECK-NEXT: [[T_0:%.*]] = icmp uge i8 [[ADD_0]], [[C]]
282-
; CHECK-NEXT: call void @use(i1 [[T_0]])
280+
; CHECK-NEXT: call void @use(i1 true)
283281
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]]
284-
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_0]], [[C]]
285-
; CHECK-NEXT: call void @use(i1 [[T_1]])
282+
; CHECK-NEXT: call void @use(i1 true)
286283
; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]]
287-
; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[ADD_2]], [[C]]
288-
; CHECK-NEXT: call void @use(i1 [[C_4]])
284+
; CHECK-NEXT: call void @use(i1 true)
289285
; CHECK-NEXT: ret void
290286
; CHECK: if.end:
291287
; CHECK-NEXT: ret void
@@ -318,8 +314,7 @@ define i1 @test_n_must_ule_1_due_to_nuw(i8 %n, i8 %i) {
318314
; CHECK-NEXT: entry:
319315
; CHECK-NEXT: [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -1
320316
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]
321-
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]
322-
; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
317+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
323318
; CHECK: if.then:
324319
; CHECK-NEXT: ret i1 true
325320
; CHECK: if.end:
@@ -376,8 +371,7 @@ define i1 @test_n_must_ule_2_due_to_nuw(i8 %n, i8 %i) {
376371
; CHECK-NEXT: entry:
377372
; CHECK-NEXT: [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -2
378373
; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]]
379-
; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]]
380-
; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
374+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
381375
; CHECK: if.then:
382376
; CHECK-NEXT: ret i1 true
383377
; CHECK: if.end:
@@ -435,10 +429,9 @@ define i1 @add_nuw_neg_pr54224_i16(i16 %a) {
435429
; CHECK-LABEL: @add_nuw_neg_pr54224_i16(
436430
; CHECK-NEXT: entry:
437431
; CHECK-NEXT: [[NEG2:%.*]] = add nuw i16 [[A:%.*]], -305
438-
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]]
439-
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
432+
; CHECK-NEXT: br i1 false, label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
440433
; CHECK: exit.1:
441-
; CHECK-NEXT: ret i1 false
434+
; CHECK-NEXT: ret i1 true
442435
; CHECK: exit.2:
443436
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0
444437
; CHECK-NEXT: ret i1 [[C_3]]
@@ -464,8 +457,7 @@ define i1 @add_nuw_neg_pr54224_i64(i64 %a) {
464457
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]]
465458
; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]]
466459
; CHECK: exit.1:
467-
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i64 [[A]], 0
468-
; CHECK-NEXT: ret i1 [[C_2]]
460+
; CHECK-NEXT: ret i1 true
469461
; CHECK: exit.2:
470462
; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i64 [[A]], 0
471463
; CHECK-NEXT: ret i1 [[C_3]]

llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,8 @@ define i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) {
181181
; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]]
182182
; CHECK-NEXT: br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]]
183183
; CHECK: then.2:
184-
; CHECK-NEXT: [[C_2:%.*]] = icmp ne ptr [[A]], null
185184
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0
186-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_2]], [[C_3]]
185+
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[C_3]]
187186
; CHECK-NEXT: ret i1 [[AND]]
188187
; CHECK: else.2:
189188
; CHECK-NEXT: ret i1 false

llvm/test/Transforms/ConstraintElimination/gep-arithmetic-add.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,8 +289,7 @@ define i4 @ptr_N_step_zext_n_zext(ptr %src, ptr %lower, ptr %upper, i16 %N, i16
289289
; CHECK-NEXT: br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
290290
; CHECK: ptr.check:
291291
; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i32 [[STEP_ADD_1_EXT]]
292-
; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]
293-
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], false
292+
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 false, false
294293
; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]
295294
; CHECK: exit:
296295
; CHECK-NEXT: ret i4 3
@@ -344,9 +343,8 @@ define i4 @ptr_N_step_zext_n_zext_out_of_bounds(ptr %src, ptr %lower, ptr %upper
344343
; CHECK-NEXT: br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
345344
; CHECK: ptr.check:
346345
; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i32 [[STEP_ADD_2_EXT]]
347-
; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]]
348346
; CHECK-NEXT: [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]]
349-
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]]
347+
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 false, [[CMP_STEP_END]]
350348
; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]
351349
; CHECK: exit:
352350
; CHECK-NEXT: ret i4 3

llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,9 +530,8 @@ define i4 @ptr_N_unsigned_positive(ptr %src, ptr %lower, ptr %upper, i16 %N, i16
530530
; CHECK-NEXT: [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]]
531531
; CHECK-NEXT: [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]]
532532
; CHECK-NEXT: [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]]
533-
; CHECK-NEXT: [[N_NEG:%.*]] = icmp ult i16 [[N]], 0
534533
; CHECK-NEXT: [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]]
535-
; CHECK-NEXT: [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], [[N_NEG]]
534+
; CHECK-NEXT: [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], false
536535
; CHECK-NEXT: br i1 [[OR_PRECOND_1]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]]
537536
; CHECK: trap.bb:
538537
; CHECK-NEXT: ret i4 2

llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,8 +369,7 @@ define i1 @ptr.int.struct.test.ult.due.to.second.dimension.var.index(ptr %start,
369369
; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64
370370
; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0
371371
; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr
372-
; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]]
373-
; CHECK-NEXT: ret i1 [[C_0]]
372+
; CHECK-NEXT: ret i1 true
374373
; CHECK: if.end:
375374
; CHECK-NEXT: ret i1 true
376375
;

llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,7 @@ define i1 @gep_decomp_i80(ptr %a) {
128128
; CHECK-LABEL: @gep_decomp_i80(
129129
; CHECK-NEXT: entry:
130130
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i80 1973801615886922022913
131-
; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[GEP]], null
132-
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
131+
; CHECK-NEXT: br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]]
133132
; CHECK: then:
134133
; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i80 1973801615886922022913
135134
; CHECK-NEXT: ret i1 true

llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ define void @checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n)
2323
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
2424
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
2525
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
26-
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]]
26+
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
2727
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_LATCH]]
2828
; CHECK: loop.latch:
2929
; CHECK-NEXT: store i8 0, ptr [[PTR_IV]], align 4
@@ -88,7 +88,7 @@ define void @some_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8
8888
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
8989
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
9090
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
91-
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]]
91+
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
9292
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]]
9393
; CHECK: loop.body:
9494
; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1
@@ -166,7 +166,7 @@ define void @no_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %
166166
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
167167
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
168168
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
169-
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]]
169+
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
170170
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]]
171171
; CHECK: loop.body:
172172
; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1

llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ define void @loop_phi_pos_start_value(i32 %y, i1 %c, i32 %n) {
2020
; CHECK-NEXT: call void @use(i1 [[C_2]])
2121
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 9
2222
; CHECK-NEXT: call void @use(i1 [[C_3]])
23-
; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[X]], 0
24-
; CHECK-NEXT: call void @use(i1 [[C_4]])
23+
; CHECK-NEXT: call void @use(i1 true)
2524
; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 9
2625
; CHECK-NEXT: call void @use(i1 [[C_5]])
2726
; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 1

llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ define void @test1(ptr %src, ptr noundef %lower, ptr noundef %upper, i8 %N) {
1919
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_BODY:%.*]]
2020
; CHECK: loop.body:
2121
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
22-
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
2322
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
24-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]]
23+
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
2524
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
2625
; CHECK: loop.body.1:
2726
; CHECK-NEXT: [[PTR_SRC_IV:%.*]] = bitcast ptr [[SRC_IV]] to ptr
@@ -120,9 +119,8 @@ define void @test2(ptr %src, ptr %lower, ptr %upper, i8 %N) {
120119
; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_BODY:%.*]]
121120
; CHECK: loop.body:
122121
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
123-
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
124122
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
125-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]]
123+
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
126124
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
127125
; CHECK: loop.body.1:
128126
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[IV]], 1
@@ -218,7 +216,7 @@ define void @test2_with_ne(ptr %src, ptr %lower, ptr %upper, i8 %N) {
218216
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
219217
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
220218
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
221-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]]
219+
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
222220
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
223221
; CHECK: loop.body.1:
224222
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[IV]], 1
@@ -314,7 +312,7 @@ define void @test3(ptr %src, ptr %lower, ptr %upper, i8 %N) {
314312
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
315313
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
316314
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
317-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]]
315+
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
318316
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
319317
; CHECK: loop.body.1:
320318
; CHECK-NEXT: [[SRC_IV_1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[NEXT]]

llvm/test/Transforms/ConstraintElimination/max-row-limit.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22
; RUN: opt -passes=constraint-elimination -S %s | FileCheck --check-prefixes=COMMON,SIMP %s
3-
; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=4 -S %s | FileCheck --check-prefixes=COMMON,SIMP %s
4-
; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=3 -S %s | FileCheck --check-prefixes=COMMON,NOSIMP %s
3+
; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=9 -S %s | FileCheck --check-prefixes=COMMON,SIMP %s
4+
; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=8 -S %s | FileCheck --check-prefixes=COMMON,NOSIMP %s
55

66

77
define i1 @test_max_row_limit(i32 %l0, i32 %l1, i32 %l2, i32 %l3, i32 %l4) {

llvm/test/Transforms/ConstraintElimination/mul.ll

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ define i1 @test_mul_const_nuw_unsigned_1(i8 %start, i8 %high) {
99
; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4
1010
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
1111
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
12-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
13-
; CHECK-NEXT: ret i1 [[T_1]]
12+
; CHECK-NEXT: ret i1 true
1413
;
1514
entry:
1615
%start.mul.4 = mul nuw i8 %start, 4
@@ -28,8 +27,7 @@ define i1 @test_mul_const_nuw_unsigned_2(i8 %start, i8 %high) {
2827
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
2928
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
3029
; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
31-
; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
32-
; CHECK-NEXT: ret i1 [[T]]
30+
; CHECK-NEXT: ret i1 true
3331
;
3432
entry:
3533
%start.mul.4 = mul nuw i8 %start, 4
@@ -163,8 +161,7 @@ define i1 @test_mul_const_nuw_unsigned_8(i8 %start, i8 %high) {
163161
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
164162
; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
165163
; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
166-
; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]]
167-
; CHECK-NEXT: ret i1 [[T_5]]
164+
; CHECK-NEXT: ret i1 true
168165
;
169166
entry:
170167
%start.mul.4 = mul nuw i8 %start, 4
@@ -191,8 +188,7 @@ define i1 @test_mul_const_nuw_unsigned_9(i8 %start, i8 %high) {
191188
; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]]
192189
; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1
193190
; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3
194-
; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]]
195-
; CHECK-NEXT: ret i1 [[F_5]]
191+
; CHECK-NEXT: ret i1 false
196192
;
197193
entry:
198194
%start.mul.4 = mul nuw i8 %start, 4
@@ -371,8 +367,7 @@ define i1 @test_mul_add_const_nuw_unsigned_1(i8 %start, i8 %high) {
371367
; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4
372368
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
373369
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
374-
; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]]
375-
; CHECK-NEXT: ret i1 [[T_1]]
370+
; CHECK-NEXT: ret i1 true
376371
;
377372
entry:
378373
%add = add nuw i8 %start, 3
@@ -392,8 +387,7 @@ define i1 @test_mul_add_const_nuw_unsigned_2(i8 %start, i8 %high) {
392387
; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]]
393388
; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]])
394389
; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2
395-
; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]]
396-
; CHECK-NEXT: ret i1 [[T_2]]
390+
; CHECK-NEXT: ret i1 true
397391
;
398392
entry:
399393
%add = add nuw i8 %start, 3

llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,8 @@ define i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) {
181181
; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]]
182182
; CHECK-NEXT: br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]]
183183
; CHECK: then.2:
184-
; CHECK-NEXT: [[C_2:%.*]] = icmp ne ptr [[A]], null
185184
; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0
186-
; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_2]], [[C_3]]
185+
; CHECK-NEXT: [[OR:%.*]] = or i1 true, [[C_3]]
187186
; CHECK-NEXT: ret i1 [[OR]]
188187
; CHECK: else.2:
189188
; CHECK-NEXT: ret i1 false

0 commit comments

Comments
 (0)