diff options
| author | Nick Lewycky <nicholas@mxc.ca> | 2019-04-01 20:03:16 +0000 |
|---|---|---|
| committer | Nick Lewycky <nicholas@mxc.ca> | 2019-04-01 20:03:16 +0000 |
| commit | 66d7eb97045e0fda283ff336297e1a46869152f6 (patch) | |
| tree | 6b5942804aa0050923e7570f2d2b1c3617cfd61f /llvm/lib/Analysis | |
| parent | c791a20b429b582fb44ed6ee32071e1f704284db (diff) | |
| download | bcm5719-llvm-66d7eb97045e0fda283ff336297e1a46869152f6.tar.gz bcm5719-llvm-66d7eb97045e0fda283ff336297e1a46869152f6.zip | |
Not all blocks are reachable from entry. Don't assume they are.
Fixes a bug in isPotentiallyReachable, noticed by inspection.
llvm-svn: 357425
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/CFG.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/llvm/lib/Analysis/CFG.cpp b/llvm/lib/Analysis/CFG.cpp index d71dd116ce3..6ef36dcad57 100644 --- a/llvm/lib/Analysis/CFG.cpp +++ b/llvm/lib/Analysis/CFG.cpp @@ -226,10 +226,17 @@ bool llvm::isPotentiallyReachable(const Instruction *A, const Instruction *B, Worklist.push_back(const_cast<BasicBlock*>(A->getParent())); } - if (A->getParent() == &A->getParent()->getParent()->getEntryBlock()) - return true; - if (B->getParent() == &A->getParent()->getParent()->getEntryBlock()) - return false; + if (DT) { + if (DT->isReachableFromEntry(A->getParent()) != + DT->isReachableFromEntry(B->getParent())) + return false; + if (A->getParent() == &A->getParent()->getParent()->getEntryBlock() && + DT->isReachableFromEntry(B->getParent())) + return true; + if (B->getParent() == &A->getParent()->getParent()->getEntryBlock() && + DT->isReachableFromEntry(A->getParent())) + return false; + } return isPotentiallyReachableFromMany( Worklist, const_cast<BasicBlock *>(B->getParent()), DT, LI); |

