[llvm] 00396e6 - [ConstraintElim] Support arbitrary incoming values for inductions (#68032)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 3 04:27:59 PDT 2023
Author: Florian Hahn
Date: 2023-10-03T12:27:56+01:00
New Revision: 00396e6a1a0b79fda008cb4e86b616d7952b33c8
URL: https://github.com/llvm/llvm-project/commit/00396e6a1a0b79fda008cb4e86b616d7952b33c8
DIFF: https://github.com/llvm/llvm-project/commit/00396e6a1a0b79fda008cb4e86b616d7952b33c8.diff
LOG: [ConstraintElim] Support arbitrary incoming values for inductions (#68032)
Support arbitray incoming values for AddRecs by getting the loop
predecessor and checking if its SCEV matches the AddRec start.
This is done after the existing check, which can help to catch cases
where the expression gets simplified by SCEV to either an IR constant or
existing value which can be used instead.
Added:
Modified:
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index bca37da5ff10f2b..e71e7eeb8ef1e18 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -859,18 +859,18 @@ void State::addInfoForInductions(BasicBlock &BB) {
return;
auto *AR = dyn_cast_or_null<SCEVAddRecExpr>(SE.getSCEV(PN));
- if (!AR)
+ BasicBlock *LoopPred = L->getLoopPredecessor();
+ if (!AR || !LoopPred)
return;
const SCEV *StartSCEV = AR->getStart();
Value *StartValue = nullptr;
- if (auto *C = dyn_cast<SCEVConstant>(StartSCEV))
+ if (auto *C = dyn_cast<SCEVConstant>(StartSCEV)) {
StartValue = C->getValue();
- else if (auto *U = dyn_cast<SCEVUnknown>(StartSCEV))
- StartValue = U->getValue();
-
- if (!StartValue)
- return;
+ } else {
+ StartValue = PN->getIncomingValueForBlock(LoopPred);
+ assert(SE.getSCEV(StartValue) == StartSCEV && "inconsistent start value");
+ }
DomTreeNode *DTN = DT.getNode(InLoopSucc);
auto Inc = SE.getMonotonicPredicateType(AR, CmpInst::ICMP_UGT);
diff --git a/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll b/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll
index 4835d48c57b6327..e5d101f7fdea106 100644
--- a/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll
+++ b/llvm/test/Transforms/ConstraintElimination/monotonic-int-phis-nested-loops.ll
@@ -17,8 +17,7 @@ define void @start_value_of_inner_add_rec_is_add_rec_condition_can_be_simplified
; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp eq i32 [[K_0]], [[LEN]]
; CHECK-NEXT: br i1 [[CMP2_NOT]], label [[OUTER_LATCH]], label [[INNER_LATCH]]
; CHECK: inner.latch:
-; CHECK-NEXT: [[CMP_NOT_I:%.*]] = icmp ult i32 [[K_0]], [[LEN]]
-; CHECK-NEXT: call void @use(i1 [[CMP_NOT_I]])
+; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: [[K_INC]] = add i32 [[K_0]], 1
; CHECK-NEXT: br label [[INNER_HEADER]]
; CHECK: outer.latch:
More information about the llvm-commits
mailing list