[llvm] [polly] [DomTree] Assert non-null block for pre-dom tree (PR #186790)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 16 07:06:03 PDT 2026
https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/186790
>From 71a64868dd2e0629753942a896ca235e8e100070 Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Mon, 16 Mar 2026 09:43:26 +0000
Subject: [PATCH 1/2] [DomTree] Assert non-null block for pre-dom tree
In a pre-dominator tree, blocks should never be null.
---
llvm/include/llvm/Support/GenericDomTree.h | 5 ++++-
llvm/lib/Analysis/ScalarEvolution.cpp | 2 +-
polly/lib/Analysis/ScopBuilder.cpp | 2 +-
3 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h
index 832b6e02daf58..6d977069322a6 100644
--- a/llvm/include/llvm/Support/GenericDomTree.h
+++ b/llvm/include/llvm/Support/GenericDomTree.h
@@ -388,7 +388,10 @@ class DominatorTreeBase {
assert(BlockNumberEpoch ==
GraphTraits<ParentPtr>::getNumberEpoch(Parent) &&
"dominator tree used with outdated block numbers");
- return BB ? GraphTraits<const NodeT *>::getNumber(BB) + 1 : 0;
+ assert((IsPostDom || BB) && "pre-dominator tree block must be non-null");
+ if (IsPostDom && !BB)
+ return 0; // BB may only be nullptr for post-dominator tree
+ return GraphTraits<const NodeT *>::getNumber(BB) + 1;
} else {
if (auto It = NodeNumberMap.find(BB); It != NodeNumberMap.end())
return It->second;
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index c387404bdaee7..d9768c83424bd 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -7672,7 +7672,7 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
// reachable. Such instructions don't matter, and they aren't required
// to obey basic rules for definitions dominating uses which this
// analysis depends on.
- if (!DT.isReachableFromEntry(I->getParent()))
+ if (!I->getParent() || !DT.isReachableFromEntry(I->getParent()))
return getUnknown(PoisonValue::get(V->getType()));
} else if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
return getConstant(CI);
diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp
index 1ea9a554f761a..f4d654fa74cb4 100644
--- a/polly/lib/Analysis/ScopBuilder.cpp
+++ b/polly/lib/Analysis/ScopBuilder.cpp
@@ -637,7 +637,7 @@ void ScopBuilder::propagateDomainConstraintsToRegionExit(
auto *RI = scop->getRegion().getRegionInfo();
auto *BBReg = RI ? RI->getRegionFor(BB) : nullptr;
auto *ExitBB = BBReg ? BBReg->getExit() : nullptr;
- if (!BBReg || BBReg->getEntry() != BB || !scop->contains(ExitBB))
+ if (!BBReg || BBReg->getEntry() != BB || !ExitBB || !scop->contains(ExitBB))
return;
// Do not propagate the domain if there is a loop backedge inside the region
>From 6d4873a1a55e9e3b381f22f1361f5c1e35f1fb8a Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Mon, 16 Mar 2026 14:05:36 +0000
Subject: [PATCH 2/2] fix SLPVectorize
---
llvm/lib/Analysis/ScalarEvolution.cpp | 2 +-
llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index d9768c83424bd..c387404bdaee7 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -7672,7 +7672,7 @@ ScalarEvolution::getOperandsToCreate(Value *V, SmallVectorImpl<Value *> &Ops) {
// reachable. Such instructions don't matter, and they aren't required
// to obey basic rules for definitions dominating uses which this
// analysis depends on.
- if (!I->getParent() || !DT.isReachableFromEntry(I->getParent()))
+ if (!DT.isReachableFromEntry(I->getParent()))
return getUnknown(PoisonValue::get(V->getType()));
} else if (ConstantInt *CI = dyn_cast<ConstantInt>(V))
return getConstant(CI);
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
index 97ba8eee6742c..6b459e046da38 100644
--- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp
@@ -28333,6 +28333,8 @@ bool SLPVectorizerPass::vectorizeGEPIndices(BasicBlock *BB, BoUpSLP &R) {
const SCEV *SCEVI = SE->getSCEV(GEPList[I]);
for (int J = I + 1; J < E && Candidates.size() > 1; ++J) {
auto *GEPJ = GEPList[J];
+ if (!Candidates.count(GEPJ))
+ continue;
const SCEV *SCEVJ = SE->getSCEV(GEPList[J]);
if (isa<SCEVConstant>(SE->getMinusSCEV(SCEVI, SCEVJ))) {
Candidates.remove(GEPI);
More information about the llvm-commits
mailing list