From d4c22859db8a3ac3ea11d9fdede28dcb57f3aee1 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Mon, 16 Mar 2026 16:07:49 +0100 Subject: [PATCH] [DomTree] Assert non-null block for pre-dom tree (#186790) In a pre-dominator tree, blocks should never be null. --- llvm/include/llvm/Support/GenericDomTree.h | 8 ++++++-- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 2 ++ polly/lib/Analysis/ScopBuilder.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Support/GenericDomTree.h b/llvm/include/llvm/Support/GenericDomTree.h index 832b6e02daf5..920983e7bd80 100644 --- a/llvm/include/llvm/Support/GenericDomTree.h +++ b/llvm/include/llvm/Support/GenericDomTree.h @@ -384,11 +384,15 @@ protected: private: std::optional getNodeIndex(const NodeT *BB) const { if constexpr (GraphHasNodeNumbers) { - // BB can be nullptr, map nullptr to index 0. assert(BlockNumberEpoch == GraphTraits::getNumberEpoch(Parent) && "dominator tree used with outdated block numbers"); - return BB ? GraphTraits::getNumber(BB) + 1 : 0; + if constexpr (IsPostDom) { + if (!BB) + return 0; // BB may be nullptr for post-dominator tree, map to 0. + } else + assert(BB && "dominator tree block must be non-null"); + return GraphTraits::getNumber(BB) + 1; } else { if (auto It = NodeNumberMap.find(BB); It != NodeNumberMap.end()) return It->second; diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 97ba8eee6742..6b459e046da3 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(SE->getMinusSCEV(SCEVI, SCEVJ))) { Candidates.remove(GEPI); diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index 1ea9a554f761..f4d654fa74cb 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