Skip to content

Commit 4ccdab3

Browse files
authored
[ConstraintElim] Use isKnownNonNegative for condition transfer. (#72879)
Use isKnownNonNegative for information transfer. This can improve results, in cases where ValueTracking can infer additional non-negative info, e.g. for phi nodes. This allows simplifying the check from llvm/llvm-project#63126 by ConstraintElimination. It is also simplified by IndVarSimplify now; note the changes in llvm/test/Transforms/PhaseOrdering/loop-access-checks.ll, due to this now being simplified earlier.
1 parent c77d79b commit 4ccdab3

File tree

4 files changed

+38
-60
lines changed

4 files changed

+38
-60
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,10 @@ bool ConstraintInfo::doesHold(CmpInst::Predicate Pred, Value *A,
773773
void ConstraintInfo::transferToOtherSystem(
774774
CmpInst::Predicate Pred, Value *A, Value *B, unsigned NumIn,
775775
unsigned NumOut, SmallVectorImpl<StackEntry> &DFSInStack) {
776+
auto IsKnownNonNegative = [this](Value *V) {
777+
return doesHold(CmpInst::ICMP_SGE, V, ConstantInt::get(V->getType(), 0)) ||
778+
isKnownNonNegative(V, DL, /*Depth=*/MaxAnalysisRecursionDepth - 1);
779+
};
776780
// Check if we can combine facts from the signed and unsigned systems to
777781
// derive additional facts.
778782
if (!A->getType()->isIntegerTy())
@@ -786,7 +790,7 @@ void ConstraintInfo::transferToOtherSystem(
786790
case CmpInst::ICMP_ULT:
787791
case CmpInst::ICMP_ULE:
788792
// If B is a signed positive constant, then A >=s 0 and A <s (or <=s) B.
789-
if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0))) {
793+
if (IsKnownNonNegative(B)) {
790794
addFact(CmpInst::ICMP_SGE, A, ConstantInt::get(B->getType(), 0), NumIn,
791795
NumOut, DFSInStack);
792796
addFact(CmpInst::getSignedPredicate(Pred), A, B, NumIn, NumOut,
@@ -796,30 +800,29 @@ void ConstraintInfo::transferToOtherSystem(
796800
case CmpInst::ICMP_UGE:
797801
case CmpInst::ICMP_UGT:
798802
// If A is a signed positive constant, then B >=s 0 and A >s (or >=s) B.
799-
if (doesHold(CmpInst::ICMP_SGE, A, ConstantInt::get(B->getType(), 0))) {
803+
if (IsKnownNonNegative(A)) {
800804
addFact(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0), NumIn,
801805
NumOut, DFSInStack);
802806
addFact(CmpInst::getSignedPredicate(Pred), A, B, NumIn, NumOut,
803807
DFSInStack);
804808
}
805809
break;
806810
case CmpInst::ICMP_SLT:
807-
if (doesHold(CmpInst::ICMP_SGE, A, ConstantInt::get(B->getType(), 0)))
811+
if (IsKnownNonNegative(A))
808812
addFact(CmpInst::ICMP_ULT, A, B, NumIn, NumOut, DFSInStack);
809813
break;
810814
case CmpInst::ICMP_SGT: {
811815
if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), -1)))
812816
addFact(CmpInst::ICMP_UGE, A, ConstantInt::get(B->getType(), 0), NumIn,
813817
NumOut, DFSInStack);
814-
if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0)))
818+
if (IsKnownNonNegative(B))
815819
addFact(CmpInst::ICMP_UGT, A, B, NumIn, NumOut, DFSInStack);
816820

817821
break;
818822
}
819823
case CmpInst::ICMP_SGE:
820-
if (doesHold(CmpInst::ICMP_SGE, B, ConstantInt::get(B->getType(), 0))) {
824+
if (IsKnownNonNegative(B))
821825
addFact(CmpInst::ICMP_UGE, A, B, NumIn, NumOut, DFSInStack);
822-
}
823826
break;
824827
}
825828
}

llvm/test/Transforms/ConstraintElimination/transfer-signed-facts-to-unsigned-is-known-non-negative.ll

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,11 @@ define void @iv_known_non_negative_constant_trip_count() {
1212
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], 2
1313
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
1414
; CHECK: loop.latch:
15-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 2, [[IV]]
16-
; CHECK-NEXT: call void @use(i1 [[T_1]])
17-
; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 2, [[IV]]
18-
; CHECK-NEXT: call void @use(i1 [[T_2]])
19-
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 2, [[IV]]
20-
; CHECK-NEXT: call void @use(i1 [[F_1]])
21-
; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 2, [[IV]]
22-
; CHECK-NEXT: call void @use(i1 [[F_2]])
23-
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
24-
; CHECK-NEXT: call void @use(i1 [[C_0]])
15+
; CHECK-NEXT: call void @use(i1 true)
16+
; CHECK-NEXT: call void @use(i1 true)
17+
; CHECK-NEXT: call void @use(i1 false)
18+
; CHECK-NEXT: call void @use(i1 false)
19+
; CHECK-NEXT: call void @use(i1 false)
2520
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
2621
; CHECK-NEXT: br label [[LOOP_HEADER]]
2722
; CHECK: exit.1:
@@ -112,11 +107,9 @@ define void @iv_known_non_negative_variable_trip_count(i8 %N) {
112107
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[IV]], [[N:%.*]]
113108
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
114109
; CHECK: loop.latch:
115-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[N]], [[IV]]
116-
; CHECK-NEXT: call void @use(i1 [[T_1]])
117110
; CHECK-NEXT: call void @use(i1 true)
118-
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
119-
; CHECK-NEXT: call void @use(i1 [[F_1]])
111+
; CHECK-NEXT: call void @use(i1 true)
112+
; CHECK-NEXT: call void @use(i1 false)
120113
; CHECK-NEXT: call void @use(i1 false)
121114
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
122115
; CHECK-NEXT: call void @use(i1 [[C_0]])
@@ -208,16 +201,11 @@ define void @iv_known_non_negative_iv_constant_trip_count_sgt() {
208201
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 2, [[IV]]
209202
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
210203
; CHECK: loop.latch:
211-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[IV]], 2
212-
; CHECK-NEXT: call void @use(i1 [[T_1]])
213-
; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 2, [[IV]]
214-
; CHECK-NEXT: call void @use(i1 [[T_2]])
215-
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 2, [[IV]]
216-
; CHECK-NEXT: call void @use(i1 [[F_1]])
217-
; CHECK-NEXT: [[F_2:%.*]] = icmp sle i8 2, [[IV]]
218-
; CHECK-NEXT: call void @use(i1 [[F_2]])
219-
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
220-
; CHECK-NEXT: call void @use(i1 [[C_0]])
204+
; CHECK-NEXT: call void @use(i1 false)
205+
; CHECK-NEXT: call void @use(i1 true)
206+
; CHECK-NEXT: call void @use(i1 false)
207+
; CHECK-NEXT: call void @use(i1 false)
208+
; CHECK-NEXT: call void @use(i1 false)
221209
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
222210
; CHECK-NEXT: br label [[LOOP_HEADER]]
223211
; CHECK: exit.1:
@@ -258,11 +246,9 @@ define void @iv_known_non_negative_iv_variable_trip_count_sgt(i8 %N) {
258246
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[N:%.*]], [[IV]]
259247
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
260248
; CHECK: loop.latch:
261-
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[IV]], [[N]]
262-
; CHECK-NEXT: call void @use(i1 [[T_1]])
249+
; CHECK-NEXT: call void @use(i1 false)
263250
; CHECK-NEXT: call void @use(i1 true)
264-
; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[N]], [[IV]]
265-
; CHECK-NEXT: call void @use(i1 [[F_1]])
251+
; CHECK-NEXT: call void @use(i1 false)
266252
; CHECK-NEXT: call void @use(i1 false)
267253
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
268254
; CHECK-NEXT: call void @use(i1 [[C_0]])
@@ -355,16 +341,11 @@ define void @iv_known_non_negative_iv_constant_trip_count_sge() {
355341
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 2, [[IV]]
356342
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
357343
; CHECK: loop.latch:
358-
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 2, [[IV]]
359-
; CHECK-NEXT: call void @use(i1 [[T_1]])
360-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i8 2, [[IV]]
361-
; CHECK-NEXT: call void @use(i1 [[T_2]])
362-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 2, [[IV]]
363-
; CHECK-NEXT: call void @use(i1 [[F_1]])
364-
; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 2, [[IV]]
365-
; CHECK-NEXT: call void @use(i1 [[F_2]])
366-
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
367-
; CHECK-NEXT: call void @use(i1 [[C_0]])
344+
; CHECK-NEXT: call void @use(i1 true)
345+
; CHECK-NEXT: call void @use(i1 true)
346+
; CHECK-NEXT: call void @use(i1 false)
347+
; CHECK-NEXT: call void @use(i1 false)
348+
; CHECK-NEXT: call void @use(i1 false)
368349
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
369350
; CHECK-NEXT: br label [[LOOP_HEADER]]
370351
; CHECK: exit.1:
@@ -405,11 +386,9 @@ define void @iv_known_non_negative_iv_variable_trip_count_sge(i8 %N) {
405386
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i8 [[N:%.*]], [[IV]]
406387
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
407388
; CHECK: loop.latch:
408-
; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[N]], [[IV]]
409-
; CHECK-NEXT: call void @use(i1 [[T_1]])
410389
; CHECK-NEXT: call void @use(i1 true)
411-
; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[N]], [[IV]]
412-
; CHECK-NEXT: call void @use(i1 [[F_1]])
390+
; CHECK-NEXT: call void @use(i1 true)
391+
; CHECK-NEXT: call void @use(i1 false)
413392
; CHECK-NEXT: call void @use(i1 false)
414393
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
415394
; CHECK-NEXT: call void @use(i1 [[C_0]])

llvm/test/Transforms/ConstraintElimination/transfer-unsigned-facts-to-signed-is-known-non-negative.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,9 @@ define void @iv_known_non_negative_iv_variable_trip_count_uge(i8 %N) {
5555
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
5656
; CHECK: loop.latch:
5757
; CHECK-NEXT: call void @use(i1 true)
58-
; CHECK-NEXT: [[T_2:%.*]] = icmp sge i8 [[IV]], [[N]]
59-
; CHECK-NEXT: call void @use(i1 [[T_2]])
58+
; CHECK-NEXT: call void @use(i1 true)
59+
; CHECK-NEXT: call void @use(i1 false)
6060
; CHECK-NEXT: call void @use(i1 false)
61-
; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 [[IV]], [[N]]
62-
; CHECK-NEXT: call void @use(i1 [[F_2]])
6361
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
6462
; CHECK-NEXT: call void @use(i1 [[C_0]])
6563
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1
@@ -147,11 +145,9 @@ define void @iv_known_non_negative_iv_variable_trip_count_ugt(i8 %N) {
147145
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
148146
; CHECK: loop.latch:
149147
; CHECK-NEXT: call void @use(i1 true)
150-
; CHECK-NEXT: [[T_2:%.*]] = icmp sgt i8 [[IV]], [[N]]
151-
; CHECK-NEXT: call void @use(i1 [[T_2]])
148+
; CHECK-NEXT: call void @use(i1 true)
149+
; CHECK-NEXT: call void @use(i1 false)
152150
; CHECK-NEXT: call void @use(i1 false)
153-
; CHECK-NEXT: [[F_2:%.*]] = icmp slt i8 [[IV]], [[N]]
154-
; CHECK-NEXT: call void @use(i1 [[F_2]])
155151
; CHECK-NEXT: [[C_0:%.*]] = icmp ugt i8 [[IV]], 2
156152
; CHECK-NEXT: call void @use(i1 [[C_0]])
157153
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i8 [[IV]], 1

llvm/test/Transforms/PhaseOrdering/loop-access-checks.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,18 +280,18 @@ define void @loop_with_signed_induction(ptr noundef nonnull align 8 dereferencea
280280
; CHECK-NEXT: [[SUB_PTR_SUB_I_I:%.*]] = sub i64 [[SUB_PTR_LHS_CAST_I_I]], [[SUB_PTR_RHS_CAST_I_I]]
281281
; CHECK-NEXT: [[SUB_PTR_DIV_I_I:%.*]] = ashr exact i64 [[SUB_PTR_SUB_I_I]], 3
282282
; CHECK-NEXT: [[CMP9:%.*]] = icmp sgt i64 [[SUB_PTR_DIV_I_I]], 0
283-
; CHECK-NEXT: br i1 [[CMP9]], label [[OPERATOR_ACC_EXIT:%.*]], label [[FOR_COND_CLEANUP:%.*]]
283+
; CHECK-NEXT: br i1 [[CMP9]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]
284284
; CHECK: for.cond.cleanup:
285285
; CHECK-NEXT: ret void
286-
; CHECK: operator_acc.exit:
287-
; CHECK-NEXT: [[I_010:%.*]] = phi i64 [ [[INC:%.*]], [[OPERATOR_ACC_EXIT]] ], [ 0, [[ENTRY:%.*]] ]
286+
; CHECK: for.body:
287+
; CHECK-NEXT: [[I_010:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
288288
; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds double, ptr [[TMP1]], i64 [[I_010]]
289289
; CHECK-NEXT: [[TMP2:%.*]] = load double, ptr [[ADD_PTR_I]], align 8, !tbaa [[TBAA6:![0-9]+]]
290290
; CHECK-NEXT: [[ADD:%.*]] = fadd double [[TMP2]], 1.000000e+00
291291
; CHECK-NEXT: store double [[ADD]], ptr [[ADD_PTR_I]], align 8, !tbaa [[TBAA6]]
292292
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_010]], 1
293293
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INC]], [[SUB_PTR_DIV_I_I]]
294-
; CHECK-NEXT: br i1 [[CMP]], label [[OPERATOR_ACC_EXIT]], label [[FOR_COND_CLEANUP]]
294+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP]]
295295
;
296296
entry:
297297
%vec.addr = alloca ptr, align 8

0 commit comments

Comments
 (0)