diff options
| author | Wei Mi <wmi@google.com> | 2019-07-26 20:59:22 +0000 | 
|---|---|---|
| committer | Wei Mi <wmi@google.com> | 2019-07-26 20:59:22 +0000 | 
| commit | 55a68a24003a08f37e0d4704c8d89cd2c3f9f095 (patch) | |
| tree | ff5f8b227d9ea3b76e2d749f3d4e73bb076f374b /llvm/lib/Transforms | |
| parent | fe4b12b4deacb9b8fe9ee9887e6a897a7e955ff9 (diff) | |
| download | bcm5719-llvm-55a68a24003a08f37e0d4704c8d89cd2c3f9f095.tar.gz bcm5719-llvm-55a68a24003a08f37e0d4704c8d89cd2c3f9f095.zip | |
[JumpThreading] Stop searching predecessor when the current bb is in a
unreachable loop.
updatePredecessorProfileMetadata in jumpthreading tries to find the
first dominating predecessor block for a PHI value by searching upwards
the predecessor block chain.
But jumpthreading may see some temporary IR state which contains
unreachable bb not being cleaned up. If an unreachable loop happens to
be on the predecessor block chain, keeping chasing the predecessor
block will run into an infinite loop.
The patch fixes it.
Differential Revision: https://reviews.llvm.org/D65310
llvm-svn: 367154
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 12 | 
1 files changed, 11 insertions, 1 deletions
| diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index b86bf2fefbe..459be213bd7 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -224,13 +224,21 @@ static void updatePredecessorProfileMetadata(PHINode *PN, BasicBlock *BB) {           BasicBlock *PhiBB) -> std::pair<BasicBlock *, BasicBlock *> {      auto *PredBB = IncomingBB;      auto *SuccBB = PhiBB; +    SmallPtrSet<BasicBlock *, 16> Visited;      while (true) {        BranchInst *PredBr = dyn_cast<BranchInst>(PredBB->getTerminator());        if (PredBr && PredBr->isConditional())          return {PredBB, SuccBB}; +      Visited.insert(PredBB);        auto *SinglePredBB = PredBB->getSinglePredecessor();        if (!SinglePredBB)          return {nullptr, nullptr}; + +      // Stop searching when SinglePredBB has been visited. It means we see +      // an unreachable loop. +      if (Visited.count(SinglePredBB)) +        return {nullptr, nullptr}; +        SuccBB = PredBB;        PredBB = SinglePredBB;      } @@ -253,7 +261,9 @@ static void updatePredecessorProfileMetadata(PHINode *PN, BasicBlock *BB) {        return;      BasicBlock *PredBB = PredOutEdge.first; -    BranchInst *PredBr = cast<BranchInst>(PredBB->getTerminator()); +    BranchInst *PredBr = dyn_cast<BranchInst>(PredBB->getTerminator()); +    if (!PredBr) +      return;      uint64_t PredTrueWeight, PredFalseWeight;      // FIXME: We currently only set the profile data when it is missing. | 

