diff options
Diffstat (limited to 'lib/Transforms/Utils/BasicBlockUtils.cpp')
| -rw-r--r-- | lib/Transforms/Utils/BasicBlockUtils.cpp | 200 | 
1 files changed, 118 insertions, 82 deletions
| diff --git a/lib/Transforms/Utils/BasicBlockUtils.cpp b/lib/Transforms/Utils/BasicBlockUtils.cpp index 516a785dce1e..7da768252fc1 100644 --- a/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -20,11 +20,13 @@  #include "llvm/Analysis/CFG.h"  #include "llvm/Analysis/LoopInfo.h"  #include "llvm/Analysis/MemoryDependenceAnalysis.h" -#include "llvm/Transforms/Utils/Local.h" +#include "llvm/Analysis/MemorySSAUpdater.h" +#include "llvm/Analysis/PostDominators.h"  #include "llvm/IR/BasicBlock.h"  #include "llvm/IR/CFG.h"  #include "llvm/IR/Constants.h"  #include "llvm/IR/DebugInfoMetadata.h" +#include "llvm/IR/DomTreeUpdater.h"  #include "llvm/IR/Dominators.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/InstrTypes.h" @@ -37,6 +39,7 @@  #include "llvm/IR/Value.h"  #include "llvm/IR/ValueHandle.h"  #include "llvm/Support/Casting.h" +#include "llvm/Transforms/Utils/Local.h"  #include <cassert>  #include <cstdint>  #include <string> @@ -45,42 +48,58 @@  using namespace llvm; -void llvm::DeleteDeadBlock(BasicBlock *BB, DeferredDominance *DDT) { -  assert((pred_begin(BB) == pred_end(BB) || -         // Can delete self loop. -         BB->getSinglePredecessor() == BB) && "Block is not dead!"); -  TerminatorInst *BBTerm = BB->getTerminator(); -  std::vector<DominatorTree::UpdateType> Updates; +void llvm::DeleteDeadBlock(BasicBlock *BB, DomTreeUpdater *DTU) { +  SmallVector<BasicBlock *, 1> BBs = {BB}; +  DeleteDeadBlocks(BBs, DTU); +} -  // Loop through all of our successors and make sure they know that one -  // of their predecessors is going away. -  if (DDT) -    Updates.reserve(BBTerm->getNumSuccessors()); -  for (BasicBlock *Succ : BBTerm->successors()) { -    Succ->removePredecessor(BB); -    if (DDT) -      Updates.push_back({DominatorTree::Delete, BB, Succ}); -  } +void llvm::DeleteDeadBlocks(SmallVectorImpl <BasicBlock *> &BBs, +                            DomTreeUpdater *DTU) { +#ifndef NDEBUG +  // Make sure that all predecessors of each dead block is also dead. +  SmallPtrSet<BasicBlock *, 4> Dead(BBs.begin(), BBs.end()); +  assert(Dead.size() == BBs.size() && "Duplicating blocks?"); +  for (auto *BB : Dead) +    for (BasicBlock *Pred : predecessors(BB)) +      assert(Dead.count(Pred) && "All predecessors must be dead!"); +#endif + +  SmallVector<DominatorTree::UpdateType, 4> Updates; +  for (auto *BB : BBs) { +    // Loop through all of our successors and make sure they know that one +    // of their predecessors is going away. +    for (BasicBlock *Succ : successors(BB)) { +      Succ->removePredecessor(BB); +      if (DTU) +        Updates.push_back({DominatorTree::Delete, BB, Succ}); +    } -  // Zap all the instructions in the block. -  while (!BB->empty()) { -    Instruction &I = BB->back(); -    // If this instruction is used, replace uses with an arbitrary value. -    // Because control flow can't get here, we don't care what we replace the -    // value with.  Note that since this block is unreachable, and all values -    // contained within it must dominate their uses, that all uses will -    // eventually be removed (they are themselves dead). -    if (!I.use_empty()) -      I.replaceAllUsesWith(UndefValue::get(I.getType())); -    BB->getInstList().pop_back(); +    // Zap all the instructions in the block. +    while (!BB->empty()) { +      Instruction &I = BB->back(); +      // If this instruction is used, replace uses with an arbitrary value. +      // Because control flow can't get here, we don't care what we replace the +      // value with.  Note that since this block is unreachable, and all values +      // contained within it must dominate their uses, that all uses will +      // eventually be removed (they are themselves dead). +      if (!I.use_empty()) +        I.replaceAllUsesWith(UndefValue::get(I.getType())); +      BB->getInstList().pop_back(); +    } +    new UnreachableInst(BB->getContext(), BB); +    assert(BB->getInstList().size() == 1 && +           isa<UnreachableInst>(BB->getTerminator()) && +           "The successor list of BB isn't empty before " +           "applying corresponding DTU updates.");    } +  if (DTU) +    DTU->applyUpdates(Updates, /*ForceRemoveDuplicates*/ true); -  if (DDT) { -    DDT->applyUpdates(Updates); -    DDT->deleteBB(BB); // Deferred deletion of BB. -  } else { -    BB->eraseFromParent(); // Zap the block! -  } +  for (BasicBlock *BB : BBs) +    if (DTU) +      DTU->deleteBB(BB); +    else +      BB->eraseFromParent();  }  void llvm::FoldSingleEntryPHINodes(BasicBlock *BB, @@ -115,12 +134,9 @@ bool llvm::DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI) {    return Changed;  } -bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT, -                                     LoopInfo *LI, -                                     MemoryDependenceResults *MemDep, -                                     DeferredDominance *DDT) { -  assert(!(DT && DDT) && "Cannot call with both DT and DDT."); - +bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU, +                                     LoopInfo *LI, MemorySSAUpdater *MSSAU, +                                     MemoryDependenceResults *MemDep) {    if (BB->hasAddressTaken())      return false; @@ -131,7 +147,7 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,    // Don't break self-loops.    if (PredBB == BB) return false;    // Don't break unwinding instructions. -  if (PredBB->getTerminator()->isExceptional()) +  if (PredBB->getTerminator()->isExceptionalTerminator())      return false;    // Can't merge if there are multiple distinct successors. @@ -154,10 +170,10 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,      FoldSingleEntryPHINodes(BB, MemDep);    } -  // Deferred DT update: Collect all the edges that exit BB. These -  // dominator edges will be redirected from Pred. +  // DTU update: Collect all the edges that exit BB. +  // These dominator edges will be redirected from Pred.    std::vector<DominatorTree::UpdateType> Updates; -  if (DDT) { +  if (DTU) {      Updates.reserve(1 + (2 * succ_size(BB)));      Updates.push_back({DominatorTree::Delete, PredBB, BB});      for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I) { @@ -166,6 +182,9 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,      }    } +  if (MSSAU) +    MSSAU->moveAllAfterMergeBlocks(BB, PredBB, &*(BB->begin())); +    // Delete the unconditional branch from the predecessor...    PredBB->getInstList().pop_back(); @@ -175,6 +194,7 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,    // Move all definitions in the successor to the predecessor...    PredBB->getInstList().splice(PredBB->end(), BB->getInstList()); +  new UnreachableInst(BB->getContext(), BB);    // Eliminate duplicate dbg.values describing the entry PHI node post-splice.    for (auto Incoming : IncomingValues) { @@ -195,28 +215,24 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,    if (!PredBB->hasName())      PredBB->takeName(BB); -  // Finally, erase the old block and update dominator info. -  if (DT) -    if (DomTreeNode *DTN = DT->getNode(BB)) { -      DomTreeNode *PredDTN = DT->getNode(PredBB); -      SmallVector<DomTreeNode *, 8> Children(DTN->begin(), DTN->end()); -      for (DomTreeNode *DI : Children) -        DT->changeImmediateDominator(DI, PredDTN); - -      DT->eraseNode(BB); -    } -    if (LI)      LI->removeBlock(BB);    if (MemDep)      MemDep->invalidateCachedPredecessors(); -  if (DDT) { -    DDT->deleteBB(BB); // Deferred deletion of BB. -    DDT->applyUpdates(Updates); -  } else { -    BB->eraseFromParent(); // Nuke BB. +  // Finally, erase the old block and update dominator info. +  if (DTU) { +    assert(BB->getInstList().size() == 1 && +           isa<UnreachableInst>(BB->getTerminator()) && +           "The successor list of BB isn't empty before " +           "applying corresponding DTU updates."); +    DTU->applyUpdates(Updates, /*ForceRemoveDuplicates*/ true); +    DTU->deleteBB(BB); +  } + +  else { +    BB->eraseFromParent(); // Nuke BB if DTU is nullptr.    }    return true;  } @@ -261,13 +277,14 @@ void llvm::ReplaceInstWithInst(Instruction *From, Instruction *To) {  }  BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT, -                            LoopInfo *LI) { +                            LoopInfo *LI, MemorySSAUpdater *MSSAU) {    unsigned SuccNum = GetSuccessorNumber(BB, Succ);    // If this is a critical edge, let SplitCriticalEdge do it. -  TerminatorInst *LatchTerm = BB->getTerminator(); -  if (SplitCriticalEdge(LatchTerm, SuccNum, CriticalEdgeSplittingOptions(DT, LI) -                                                .setPreserveLCSSA())) +  Instruction *LatchTerm = BB->getTerminator(); +  if (SplitCriticalEdge( +          LatchTerm, SuccNum, +          CriticalEdgeSplittingOptions(DT, LI, MSSAU).setPreserveLCSSA()))      return LatchTerm->getSuccessor(SuccNum);    // If the edge isn't critical, then BB has a single successor or Succ has a @@ -277,14 +294,14 @@ BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, DominatorTree *DT,      // block.      assert(SP == BB && "CFG broken");      SP = nullptr; -    return SplitBlock(Succ, &Succ->front(), DT, LI); +    return SplitBlock(Succ, &Succ->front(), DT, LI, MSSAU);    }    // Otherwise, if BB has a single successor, split it at the bottom of the    // block.    assert(BB->getTerminator()->getNumSuccessors() == 1 &&           "Should have a single succ!"); -  return SplitBlock(BB, BB->getTerminator(), DT, LI); +  return SplitBlock(BB, BB->getTerminator(), DT, LI, MSSAU);  }  unsigned @@ -292,7 +309,7 @@ llvm::SplitAllCriticalEdges(Function &F,                              const CriticalEdgeSplittingOptions &Options) {    unsigned NumBroken = 0;    for (BasicBlock &BB : F) { -    TerminatorInst *TI = BB.getTerminator(); +    Instruction *TI = BB.getTerminator();      if (TI->getNumSuccessors() > 1 && !isa<IndirectBrInst>(TI))        for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i)          if (SplitCriticalEdge(TI, i, Options)) @@ -302,7 +319,8 @@ llvm::SplitAllCriticalEdges(Function &F,  }  BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt, -                             DominatorTree *DT, LoopInfo *LI) { +                             DominatorTree *DT, LoopInfo *LI, +                             MemorySSAUpdater *MSSAU) {    BasicBlock::iterator SplitIt = SplitPt->getIterator();    while (isa<PHINode>(SplitIt) || SplitIt->isEHPad())      ++SplitIt; @@ -324,6 +342,11 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt,          DT->changeImmediateDominator(I, NewNode);      } +  // Move MemoryAccesses still tracked in Old, but part of New now. +  // Update accesses in successor blocks accordingly. +  if (MSSAU) +    MSSAU->moveAllAfterSpliceBlocks(Old, New, &*(New->begin())); +    return New;  } @@ -331,6 +354,7 @@ BasicBlock *llvm::SplitBlock(BasicBlock *Old, Instruction *SplitPt,  static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB,                                        ArrayRef<BasicBlock *> Preds,                                        DominatorTree *DT, LoopInfo *LI, +                                      MemorySSAUpdater *MSSAU,                                        bool PreserveLCSSA, bool &HasLoopExit) {    // Update dominator tree if available.    if (DT) { @@ -343,6 +367,10 @@ static void UpdateAnalysisInformation(BasicBlock *OldBB, BasicBlock *NewBB,      }    } +  // Update MemoryPhis after split if MemorySSA is available +  if (MSSAU) +    MSSAU->wireOldPredecessorsToNewImmediatePredecessor(OldBB, NewBB, Preds); +    // The rest of the logic is only relevant for updating the loop structures.    if (!LI)      return; @@ -483,7 +511,8 @@ static void UpdatePHINodes(BasicBlock *OrigBB, BasicBlock *NewBB,  BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,                                           ArrayRef<BasicBlock *> Preds,                                           const char *Suffix, DominatorTree *DT, -                                         LoopInfo *LI, bool PreserveLCSSA) { +                                         LoopInfo *LI, MemorySSAUpdater *MSSAU, +                                         bool PreserveLCSSA) {    // Do not attempt to split that which cannot be split.    if (!BB->canSplitPredecessors())      return nullptr; @@ -495,7 +524,7 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,      std::string NewName = std::string(Suffix) + ".split-lp";      SplitLandingPadPredecessors(BB, Preds, Suffix, NewName.c_str(), NewBBs, DT, -                                LI, PreserveLCSSA); +                                LI, MSSAU, PreserveLCSSA);      return NewBBs[0];    } @@ -529,7 +558,7 @@ BasicBlock *llvm::SplitBlockPredecessors(BasicBlock *BB,    // Update DominatorTree, LoopInfo, and LCCSA analysis information.    bool HasLoopExit = false; -  UpdateAnalysisInformation(BB, NewBB, Preds, DT, LI, PreserveLCSSA, +  UpdateAnalysisInformation(BB, NewBB, Preds, DT, LI, MSSAU, PreserveLCSSA,                              HasLoopExit);    if (!Preds.empty()) { @@ -545,6 +574,7 @@ void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB,                                         const char *Suffix1, const char *Suffix2,                                         SmallVectorImpl<BasicBlock *> &NewBBs,                                         DominatorTree *DT, LoopInfo *LI, +                                       MemorySSAUpdater *MSSAU,                                         bool PreserveLCSSA) {    assert(OrigBB->isLandingPad() && "Trying to split a non-landing pad!"); @@ -570,7 +600,7 @@ void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB,    }    bool HasLoopExit = false; -  UpdateAnalysisInformation(OrigBB, NewBB1, Preds, DT, LI, PreserveLCSSA, +  UpdateAnalysisInformation(OrigBB, NewBB1, Preds, DT, LI, MSSAU, PreserveLCSSA,                              HasLoopExit);    // Update the PHI nodes in OrigBB with the values coming from NewBB1. @@ -606,7 +636,7 @@ void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB,      // Update DominatorTree, LoopInfo, and LCCSA analysis information.      HasLoopExit = false; -    UpdateAnalysisInformation(OrigBB, NewBB2, NewBB2Preds, DT, LI, +    UpdateAnalysisInformation(OrigBB, NewBB2, NewBB2Preds, DT, LI, MSSAU,                                PreserveLCSSA, HasLoopExit);      // Update the PHI nodes in OrigBB with the values coming from NewBB2. @@ -644,7 +674,8 @@ void llvm::SplitLandingPadPredecessors(BasicBlock *OrigBB,  }  ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, -                                             BasicBlock *Pred) { +                                             BasicBlock *Pred, +                                             DomTreeUpdater *DTU) {    Instruction *UncondBranch = Pred->getTerminator();    // Clone the return and add it to the end of the predecessor.    Instruction *NewRet = RI->clone(); @@ -678,19 +709,24 @@ ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,    // longer branch to them.    BB->removePredecessor(Pred);    UncondBranch->eraseFromParent(); + +  if (DTU) +    DTU->deleteEdge(Pred, BB); +    return cast<ReturnInst>(NewRet);  } -TerminatorInst * -llvm::SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore, -                                bool Unreachable, MDNode *BranchWeights, -                                DominatorTree *DT, LoopInfo *LI) { +Instruction *llvm::SplitBlockAndInsertIfThen(Value *Cond, +                                             Instruction *SplitBefore, +                                             bool Unreachable, +                                             MDNode *BranchWeights, +                                             DominatorTree *DT, LoopInfo *LI) {    BasicBlock *Head = SplitBefore->getParent();    BasicBlock *Tail = Head->splitBasicBlock(SplitBefore->getIterator()); -  TerminatorInst *HeadOldTerm = Head->getTerminator(); +  Instruction *HeadOldTerm = Head->getTerminator();    LLVMContext &C = Head->getContext();    BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail); -  TerminatorInst *CheckTerm; +  Instruction *CheckTerm;    if (Unreachable)      CheckTerm = new UnreachableInst(C, ThenBlock);    else @@ -725,12 +761,12 @@ llvm::SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore,  }  void llvm::SplitBlockAndInsertIfThenElse(Value *Cond, Instruction *SplitBefore, -                                         TerminatorInst **ThenTerm, -                                         TerminatorInst **ElseTerm, +                                         Instruction **ThenTerm, +                                         Instruction **ElseTerm,                                           MDNode *BranchWeights) {    BasicBlock *Head = SplitBefore->getParent();    BasicBlock *Tail = Head->splitBasicBlock(SplitBefore->getIterator()); -  TerminatorInst *HeadOldTerm = Head->getTerminator(); +  Instruction *HeadOldTerm = Head->getTerminator();    LLVMContext &C = Head->getContext();    BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent(), Tail);    BasicBlock *ElseBlock = BasicBlock::Create(C, "", Head->getParent(), Tail); | 
