[llvm] db04516 - [SCEV] Introduce getOrCreateUDivExpr (NFC) (#216832)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 18 06:07:51 PDT 2026
Author: Ramkumar Ramachandra
Date: 2026-08-18T13:07:45Z
New Revision: db04516141349e6043d61019097b11ddec558b85
URL: https://github.com/llvm/llvm-project/commit/db04516141349e6043d61019097b11ddec558b85
DIFF: https://github.com/llvm/llvm-project/commit/db04516141349e6043d61019097b11ddec558b85.diff
LOG: [SCEV] Introduce getOrCreateUDivExpr (NFC) (#216832)
Avoid error-prone munging SCEVUses in place in getUDivExpr, and allocate
the operands uniformly in a new getOrCreateUDivExpr.
Added:
Modified:
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/ScalarEvolution.h b/llvm/include/llvm/Analysis/ScalarEvolution.h
index 4e1aeea26f943..713d0dd2f9b0e 100644
--- a/llvm/include/llvm/Analysis/ScalarEvolution.h
+++ b/llvm/include/llvm/Analysis/ScalarEvolution.h
@@ -2515,6 +2515,9 @@ class ScalarEvolution {
const SCEV *getOrCreateAddRecExpr(ArrayRef<SCEVUse> Ops, const Loop *L,
SCEV::NoWrapFlags Flags);
+ // Get UDiv expression already created or create a new one.
+ const SCEV *getOrCreateUDivExpr(SCEVUse LHS, SCEVUse RHS);
+
/// Return x if \p Val is f(x) where f is a 1-1 function.
const SCEV *stripInjectiveFunctions(const SCEV *Val) const;
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index dab6f9a4e00f3..467714dd1cb50 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -3096,6 +3096,22 @@ const SCEV *ScalarEvolution::getOrCreateMulExpr(ArrayRef<SCEVUse> Ops,
return S;
}
+const SCEV *ScalarEvolution::getOrCreateUDivExpr(SCEVUse LHS, SCEVUse RHS) {
+ FoldingSetNodeID ID;
+ ID.AddInteger(scUDivExpr);
+ ID.AddPointer(LHS);
+ ID.AddPointer(RHS);
+ void *IP = nullptr;
+ SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP);
+ if (!S) {
+ S = new (SCEVAllocator) SCEVUDivExpr(ID.Intern(SCEVAllocator), LHS, RHS);
+ UniqueSCEVs.InsertNode(S, IP);
+ S->computeAndSetCanonical(*this);
+ registerUser(S, ArrayRef<SCEVUse>({LHS, RHS}));
+ }
+ return S;
+}
+
static uint64_t umul_ov(uint64_t i, uint64_t j, bool &Overflow) {
uint64_t k = i*j;
if (j > 1 && k / j != i) Overflow = true;
@@ -3489,12 +3505,8 @@ const SCEV *ScalarEvolution::getUDivExpr(SCEVUse LHS, SCEVUse RHS) {
assert(LHS->getType() == RHS->getType() &&
"SCEVUDivExpr operand types don't match!");
- FoldingSetNodeID ID;
- ID.AddInteger(scUDivExpr);
- ID.AddPointer(LHS);
- ID.AddPointer(RHS);
- void *IP = nullptr;
- if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP))
+ if (SCEV *S =
+ findExistingSCEVInCache(scUDivExpr, ArrayRef<SCEVUse>({LHS, RHS})))
return S;
// 0 udiv Y == 0
@@ -3562,19 +3574,8 @@ const SCEV *ScalarEvolution::getUDivExpr(SCEVUse LHS, SCEVUse RHS) {
const SCEV *NewLHS =
getAddRecExpr(NewStart, Step, AR->getLoop(),
NoWrap ? SCEV::FlagNW : SCEV::FlagAnyWrap);
- if (LHS != NewLHS) {
- LHS = NewLHS;
-
- // Reset the ID to include the new LHS, and check if it is
- // already cached.
- ID.clear();
- ID.AddInteger(scUDivExpr);
- ID.AddPointer(LHS);
- ID.AddPointer(RHS);
- IP = nullptr;
- if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP))
- return S;
- }
+ if (LHS != NewLHS)
+ return getUDivExpr(NewLHS, RHS);
}
}
}
@@ -3698,16 +3699,7 @@ const SCEV *ScalarEvolution::getUDivExpr(SCEVUse LHS, SCEVUse RHS) {
match(RHS, m_scev_c_NUWMul(m_SCEV(NewRHS), m_SCEVVScale())))
return getUDivExpr(NewLHS, NewRHS);
- // The Insertion Point (IP) might be invalid by now (due to UniqueSCEVs
- // changes). Make sure we get a new one.
- IP = nullptr;
- if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S;
- SCEV *S = new (SCEVAllocator) SCEVUDivExpr(ID.Intern(SCEVAllocator),
- LHS, RHS);
- UniqueSCEVs.InsertNode(S, IP);
- S->computeAndSetCanonical(*this);
- registerUser(S, ArrayRef<SCEVUse>({LHS, RHS}));
- return S;
+ return getOrCreateUDivExpr(LHS, RHS);
}
APInt gcd(const SCEVConstant *C1, const SCEVConstant *C2) {
More information about the llvm-commits
mailing list