[llvm] [SCEV] Collect and merge loop guards through PHI nodes with multiple incoming values (PR #113915)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 13 08:07:37 PST 2024
================
@@ -15217,7 +15221,83 @@ bool ScalarEvolution::matchURem(const SCEV *Expr, const SCEV *&LHS,
ScalarEvolution::LoopGuards
ScalarEvolution::LoopGuards::collect(const Loop *L, ScalarEvolution &SE) {
+ BasicBlock *Header = L->getHeader();
+ BasicBlock *Pred = L->getLoopPredecessor();
LoopGuards Guards(SE);
+ SmallPtrSet<const BasicBlock *, 8> VisitedBlocks;
+ collectFromBlock(SE, Guards, Header, Pred, VisitedBlocks);
+ return Guards;
+}
+
+void ScalarEvolution::LoopGuards::collectFromPHI(
+ ScalarEvolution &SE, ScalarEvolution::LoopGuards &Guards,
+ const PHINode &Phi, SmallPtrSetImpl<const BasicBlock *> &VisitedBlocks,
+ SmallDenseMap<const BasicBlock *, LoopGuards> &IncomingGuards,
+ unsigned Depth) {
+ if (!SE.isSCEVable(Phi.getType()))
+ return;
+
+ using MinMaxPattern = std::pair<const SCEVConstant *, SCEVTypes>;
+ auto GetMinMaxConst = [&](unsigned IncomingIdx) -> MinMaxPattern {
+ const BasicBlock *InBlock = Phi.getIncomingBlock(IncomingIdx);
+ if (!VisitedBlocks.insert(InBlock).second)
+ return {nullptr, scCouldNotCompute};
+ if (!IncomingGuards.contains(InBlock)) {
+ LoopGuards G(SE);
+ collectFromBlock(SE, G, Phi.getParent(), InBlock, VisitedBlocks,
+ Depth + 1);
+ IncomingGuards.try_emplace(InBlock, std::move(G));
+ }
+ const LoopGuards &G = IncomingGuards.at(InBlock);
----------------
fhahn wrote:
nit: Could try to avoid the repeated lookup by using `IncomingGuards.insert()`
https://github.com/llvm/llvm-project/pull/113915
More information about the llvm-commits
mailing list