diff options
| author | Alina Sbirlea <asbirlea@google.com> | 2019-10-16 22:23:20 +0000 | 
|---|---|---|
| committer | Alina Sbirlea <asbirlea@google.com> | 2019-10-16 22:23:20 +0000 | 
| commit | 4eb1a573fab3b2257e966c97a06d15159ecac922 (patch) | |
| tree | 1c6501dd1851fded8219b6f3b580e28078a835ae /llvm/lib/Transforms/Scalar | |
| parent | 471dc1fb286ae7551da1d4a0349970b2a9491052 (diff) | |
| download | bcm5719-llvm-4eb1a573fab3b2257e966c97a06d15159ecac922.tar.gz bcm5719-llvm-4eb1a573fab3b2257e966c97a06d15159ecac922.zip | |
[Utils] Cleanup similar cases to MergeBlockIntoPredecessor.
Summary:
There are two cases where a block is merged into its predecessor and the
MergeBlockIntoPredecessor API is not used. Update the API so it can be
reused in the other cases, in order to avoid code duplication.
Cleanup motivated by D68659.
Reviewers: chandlerc, sanjoy.google, george.burgess.iv
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D68670
llvm-svn: 375050
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopUnswitch.cpp | 49 | 
1 files changed, 15 insertions, 34 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp index 880f5389171..6749cda245d 100644 --- a/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -1621,43 +1621,24 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) {          if (!SinglePred) continue;  // Nothing to do.          assert(SinglePred == Pred && "CFG broken"); -        LLVM_DEBUG(dbgs() << "Merging blocks: " << Pred->getName() << " <- " -                          << Succ->getName() << "\n"); - -        // Resolve any single entry PHI nodes in Succ. -        while (PHINode *PN = dyn_cast<PHINode>(Succ->begin())) -          ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM, -                            MSSAU.get()); - -        Instruction *STI = Succ->getTerminator(); -        Instruction *Start = &*Succ->begin(); -        // If there's nothing to move, mark the starting instruction as the last -        // instruction in the block. -        if (Start == STI) -          Start = BI; - -        // Move all of the successor contents from Succ to Pred. -        Pred->getInstList().splice(BI->getIterator(), Succ->getInstList(), -                                   Succ->begin(), STI->getIterator()); -        if (MSSAU) -          MSSAU->moveAllAfterMergeBlocks(Succ, Pred, Start); - -        // Move terminator instruction from Succ now, we're deleting BI below. -        // FIXME: remove BI first might be more intuitive. -        Pred->getInstList().splice(Pred->end(), Succ->getInstList()); - -        // If Succ has any successors with PHI nodes, update them to have -        // entries coming from Pred instead of Succ. -        Succ->replaceAllUsesWith(Pred); - +        // Make the LPM and Worklist updates specific to LoopUnswitch.          LPM->deleteSimpleAnalysisValue(BI, L);          RemoveFromWorklist(BI, Worklist); -        BI->eraseFromParent(); - -        // Remove Succ from the loop tree. -        LI->removeBlock(Succ);          LPM->deleteSimpleAnalysisValue(Succ, L); -        Succ->eraseFromParent(); +        auto SuccIt = Succ->begin(); +        while (PHINode *PN = dyn_cast<PHINode>(SuccIt++)) { +          for (unsigned It = 0, E = PN->getNumOperands(); It != E; ++It) +            if (Instruction *Use = dyn_cast<Instruction>(PN->getOperand(It))) +              Worklist.push_back(Use); +          for (User *U : PN->users()) +            Worklist.push_back(cast<Instruction>(U)); +          LPM->deleteSimpleAnalysisValue(PN, L); +          RemoveFromWorklist(PN, Worklist); +          ++NumSimplify; +        } +        // Merge the block and make the remaining analyses updates. +        DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager); +        MergeBlockIntoPredecessor(Succ, &DTU, LI, MSSAU.get());          ++NumSimplify;          continue;        } | 

