diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp | 41 | 
1 files changed, 7 insertions, 34 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp index 939a1a3a868d..1bb80be8ef99 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp @@ -100,46 +100,19 @@ PreservedAnalyses BreakCriticalEdgesPass::run(Function &F,  //    Implementation of the external critical edge manipulation functions  //===----------------------------------------------------------------------===// -/// When a loop exit edge is split, LCSSA form may require new PHIs in the new -/// exit block. This function inserts the new PHIs, as needed. Preds is a list -/// of preds inside the loop, SplitBB is the new loop exit block, and DestBB is -/// the old loop exit, now the successor of SplitBB. -static void createPHIsForSplitLoopExit(ArrayRef<BasicBlock *> Preds, -                                       BasicBlock *SplitBB, -                                       BasicBlock *DestBB) { -  // SplitBB shouldn't have anything non-trivial in it yet. -  assert((SplitBB->getFirstNonPHI() == SplitBB->getTerminator() || -          SplitBB->isLandingPad()) && "SplitBB has non-PHI nodes!"); - -  // For each PHI in the destination block. -  for (PHINode &PN : DestBB->phis()) { -    unsigned Idx = PN.getBasicBlockIndex(SplitBB); -    Value *V = PN.getIncomingValue(Idx); - -    // If the input is a PHI which already satisfies LCSSA, don't create -    // a new one. -    if (const PHINode *VP = dyn_cast<PHINode>(V)) -      if (VP->getParent() == SplitBB) -        continue; - -    // Otherwise a new PHI is needed. Create one and populate it. -    PHINode *NewPN = PHINode::Create( -        PN.getType(), Preds.size(), "split", -        SplitBB->isLandingPad() ? &SplitBB->front() : SplitBB->getTerminator()); -    for (unsigned i = 0, e = Preds.size(); i != e; ++i) -      NewPN->addIncoming(V, Preds[i]); - -    // Update the original PHI. -    PN.setIncomingValue(Idx, NewPN); -  } -} -  BasicBlock *llvm::SplitCriticalEdge(Instruction *TI, unsigned SuccNum,                                      const CriticalEdgeSplittingOptions &Options,                                      const Twine &BBName) {    if (!isCriticalEdge(TI, SuccNum, Options.MergeIdenticalEdges))      return nullptr; +  return SplitKnownCriticalEdge(TI, SuccNum, Options, BBName); +} + +BasicBlock * +llvm::SplitKnownCriticalEdge(Instruction *TI, unsigned SuccNum, +                             const CriticalEdgeSplittingOptions &Options, +                             const Twine &BBName) {    assert(!isa<IndirectBrInst>(TI) &&           "Cannot split critical edge from IndirectBrInst");  | 
