[llvm-branch-commits] [llvm] release/23.x: Revert "[SCEV] Speed up forgetLoop by avoiding def-use walk for loop-header PHIs" (#212485) (PR #214651)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Aug 7 00:08:53 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: llvmbot
<details>
<summary>Changes</summary>
Backport 1c0eda0d2371a6a755f90299892a7b89dc917442
Requested by: @<!-- -->antoniofrighetto
---
Full diff: https://github.com/llvm/llvm-project/pull/214651.diff
2 Files Affected:
- (modified) llvm/lib/Analysis/ScalarEvolution.cpp (+16-6)
- (modified) llvm/unittests/Analysis/ScalarEvolutionTest.cpp (-39)
``````````diff
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 134be6ac097e0..ab8e73f514cd2 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8680,6 +8680,18 @@ bool ScalarEvolution::isBackedgeTakenCountMaxOrZero(const Loop *L) {
return getBackedgeTakenInfo(L).isConstantMaxOrZero(this);
}
+/// Push PHI nodes in the header of the given loop onto the given Worklist.
+static void PushLoopPHIs(const Loop *L,
+ SmallVectorImpl<Instruction *> &Worklist,
+ SmallPtrSetImpl<Instruction *> &Visited) {
+ BasicBlock *Header = L->getHeader();
+
+ // Push all Loop-header PHIs onto the Worklist stack.
+ for (PHINode &PN : Header->phis())
+ if (Visited.insert(&PN).second)
+ Worklist.push_back(&PN);
+}
+
ScalarEvolution::BackedgeTakenInfo &
ScalarEvolution::getPredicatedBackedgeTakenInfo(const Loop *L) {
auto &BTI = getBackedgeTakenInfo(L);
@@ -8789,6 +8801,8 @@ void ScalarEvolution::visitAndClearUsers(
void ScalarEvolution::forgetLoop(const Loop *L) {
SmallVector<const Loop *, 16> LoopWorklist(1, L);
+ SmallVector<Instruction *, 32> Worklist;
+ SmallPtrSet<Instruction *, 16> Visited;
SmallVector<SCEVUse, 16> ToForget;
// Iterate over all the loops and sub-loops to drop SCEV information.
@@ -8808,12 +8822,8 @@ void ScalarEvolution::forgetLoop(const Loop *L) {
llvm::append_range(ToForget, LoopUsersItr->second);
// Drop information about expressions based on loop-header PHIs.
- for (PHINode &PN : CurrL->getHeader()->phis()) {
- ConstantEvolutionLoopExitValue.erase(&PN);
- auto VIt = ValueExprMap.find_as(static_cast<Value *>(&PN));
- if (VIt != ValueExprMap.end())
- ToForget.push_back(VIt->second);
- }
+ PushLoopPHIs(CurrL, Worklist, Visited);
+ visitAndClearUsers(Worklist, Visited, ToForget);
LoopPropertiesCache.erase(CurrL);
// Forget all contained loops too, to avoid dangling entries in the
diff --git a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
index 99edc5b25f3e2..1e290684d3aab 100644
--- a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
+++ b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp
@@ -1709,45 +1709,6 @@ TEST_F(ScalarEvolutionsTest, ForgetValueWithOverflowInst) {
});
}
-TEST_F(ScalarEvolutionsTest, ForgetLoopPreservesUnrelatedCachesInLoopBody) {
- LLVMContext C;
- SMDiagnostic Err;
- std::unique_ptr<Module> M =
- parseAssemblyString("define void @foo(i32 %n) { "
- "entry: "
- " br label %loop "
- "loop: "
- " %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] "
- " %iv.next = add nsw i32 %iv, 1 "
- " %cmp = icmp slt i32 %iv, %n "
- " br i1 %cmp, label %loop, label %exit "
- "exit: "
- " ret void "
- "} ",
- Err, C);
-
- ASSERT_TRUE(M && "Could not parse module?");
- ASSERT_TRUE(!verifyModule(*M) && "Must have been well formed!");
-
- runWithSE(*M, "foo", [](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
- auto *IV = getInstructionByName(F, "iv");
- auto *Cmp = getInstructionByName(F, "cmp");
-
- const SCEV *IVScev = SE.getSCEV(IV);
- EXPECT_NE(IVScev, nullptr);
- EXPECT_TRUE(isa<SCEVAddRecExpr>(IVScev));
-
- const SCEV *CmpScev = SE.getSCEV(Cmp);
- EXPECT_NE(CmpScev, nullptr);
- EXPECT_TRUE(isa<SCEVUnknown>(CmpScev));
-
- Loop *L = *LI.begin();
- SE.forgetLoop(L);
- EXPECT_EQ(SE.getExistingSCEV(IV), nullptr);
- EXPECT_EQ(SE.getExistingSCEV(Cmp), CmpScev);
- });
-}
-
TEST_F(ScalarEvolutionsTest, ComplexityComparatorIsStrictWeakOrdering) {
// Regression test for a case where caching of equivalent values caused the
// comparator to get inconsistent.
``````````
</details>
https://github.com/llvm/llvm-project/pull/214651
More information about the llvm-branch-commits
mailing list