diff options
Diffstat (limited to 'gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp')
| -rw-r--r-- | gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp b/gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp index 5ae6d74130a..1b36569f7a0 100644 --- a/gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp +++ b/gnu/llvm/lib/Analysis/DivergenceAnalysis.cpp @@ -73,10 +73,8 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Value.h" -#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" -#include "llvm/Transforms/Scalar.h" #include <vector> using namespace llvm; @@ -140,14 +138,25 @@ void DivergencePropagator::exploreSyncDependency(TerminatorInst *TI) { // a2 = 2; // a = phi(a1, a2); // sync dependent on (tid < 5) BasicBlock *ThisBB = TI->getParent(); - BasicBlock *IPostDom = PDT.getNode(ThisBB)->getIDom()->getBlock(); + + // Unreachable blocks may not be in the dominator tree. + if (!DT.isReachableFromEntry(ThisBB)) + return; + + // If the function has no exit blocks or doesn't reach any exit blocks, the + // post dominator may be null. + DomTreeNode *ThisNode = PDT.getNode(ThisBB); + if (!ThisNode) + return; + + BasicBlock *IPostDom = ThisNode->getIDom()->getBlock(); if (IPostDom == nullptr) return; for (auto I = IPostDom->begin(); isa<PHINode>(I); ++I) { // A PHINode is uniform if it returns the same value no matter which path is // taken. - if (!cast<PHINode>(I)->hasConstantValue() && DV.insert(&*I).second) + if (!cast<PHINode>(I)->hasConstantOrUndefValue() && DV.insert(&*I).second) Worklist.push_back(&*I); } @@ -259,7 +268,7 @@ char DivergenceAnalysis::ID = 0; INITIALIZE_PASS_BEGIN(DivergenceAnalysis, "divergence", "Divergence Analysis", false, true) INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) -INITIALIZE_PASS_DEPENDENCY(PostDominatorTree) +INITIALIZE_PASS_DEPENDENCY(PostDominatorTreeWrapperPass) INITIALIZE_PASS_END(DivergenceAnalysis, "divergence", "Divergence Analysis", false, true) @@ -269,7 +278,7 @@ FunctionPass *llvm::createDivergenceAnalysisPass() { void DivergenceAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired<DominatorTreeWrapperPass>(); - AU.addRequired<PostDominatorTree>(); + AU.addRequired<PostDominatorTreeWrapperPass>(); AU.setPreservesAll(); } @@ -285,9 +294,10 @@ bool DivergenceAnalysis::runOnFunction(Function &F) { return false; DivergentValues.clear(); + auto &PDT = getAnalysis<PostDominatorTreeWrapperPass>().getPostDomTree(); DivergencePropagator DP(F, TTI, getAnalysis<DominatorTreeWrapperPass>().getDomTree(), - getAnalysis<PostDominatorTree>(), DivergentValues); + PDT, DivergentValues); DP.populateWithSourcesOfDivergence(); DP.propagate(); return false; |
