diff options
Diffstat (limited to 'lib/CodeGen/PHIElimination.cpp')
| -rw-r--r-- | lib/CodeGen/PHIElimination.cpp | 34 | 
1 files changed, 9 insertions, 25 deletions
| diff --git a/lib/CodeGen/PHIElimination.cpp b/lib/CodeGen/PHIElimination.cpp index b3802ed6725d..2e30cc6abd32 100644 --- a/lib/CodeGen/PHIElimination.cpp +++ b/lib/CodeGen/PHIElimination.cpp @@ -353,7 +353,7 @@ bool llvm::PHIElimination::SplitPHIEdges(MachineFunction &MF,        // We break edges when registers are live out from the predecessor block        // (not considering PHI nodes). If the register is live in to this block        // anyway, we would gain nothing from splitting. -      if (isLiveOut(Reg, *PreMBB, LV) && !isLiveIn(Reg, MBB, LV)) +      if (!LV.isLiveIn(Reg, MBB) && isLiveOut(Reg, *PreMBB, LV))          SplitCriticalEdge(PreMBB, &MBB);      }    } @@ -406,22 +406,6 @@ bool llvm::PHIElimination::isLiveOut(unsigned Reg, const MachineBasicBlock &MBB,    return false;  } -bool llvm::PHIElimination::isLiveIn(unsigned Reg, const MachineBasicBlock &MBB, -                                    LiveVariables &LV) { -  LiveVariables::VarInfo &VI = LV.getVarInfo(Reg); - -  if (VI.AliveBlocks.test(MBB.getNumber())) -    return true; - -  // defined in MBB? -  const MachineInstr *Def = MRI->getVRegDef(Reg); -  if (Def && Def->getParent() == &MBB) -    return false; - -  // killed in MBB? -  return VI.findKill(&MBB); -} -  MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,                                                       MachineBasicBlock *B) {    assert(A && B && "Missing MBB end point"); @@ -439,21 +423,21 @@ MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,    ++NumSplits;    MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock(); -  MF->push_back(NMBB); +  MF->insert(next(MachineFunction::iterator(A)), NMBB);    DEBUG(errs() << "PHIElimination splitting critical edge:"          " BB#" << A->getNumber()          << " -- BB#" << NMBB->getNumber()          << " -- BB#" << B->getNumber() << '\n');    A->ReplaceUsesOfBlockWith(B, NMBB); -  // If A may fall through to B, we may have to insert a branch. -  if (A->isLayoutSuccessor(B)) -    A->updateTerminator(); +  A->updateTerminator(); -  // Insert unconditional "jump B" instruction in NMBB. +  // Insert unconditional "jump B" instruction in NMBB if necessary.    NMBB->addSuccessor(B); -  Cond.clear(); -  MF->getTarget().getInstrInfo()->InsertBranch(*NMBB, B, NULL, Cond); +  if (!NMBB->isLayoutSuccessor(B)) { +    Cond.clear(); +    MF->getTarget().getInstrInfo()->InsertBranch(*NMBB, B, NULL, Cond); +  }    // Fix PHI nodes in B so they refer to NMBB instead of A    for (MachineBasicBlock::iterator i = B->begin(), e = B->end(); @@ -463,7 +447,7 @@ MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,          i->getOperand(ni+1).setMBB(NMBB);    if (LiveVariables *LV=getAnalysisIfAvailable<LiveVariables>()) -    LV->addNewBlock(NMBB, A); +    LV->addNewBlock(NMBB, A, B);    if (MachineDominatorTree *MDT=getAnalysisIfAvailable<MachineDominatorTree>())      MDT->addNewBlock(NMBB, A); | 
