+
+MachineBasicBlock *PHIElimination::SplitCriticalEdge(MachineBasicBlock *A,
+ MachineBasicBlock *B) {
+ assert(A && B && "Missing MBB end point");
+ ++NumSplits;
+
+ MachineFunction *MF = A->getParent();
+ MachineBasicBlock *NMBB = MF->CreateMachineBasicBlock(B->getBasicBlock());
+ MF->push_back(NMBB);
+ const unsigned NewNum = NMBB->getNumber();
+ DEBUG(errs() << "PHIElimination splitting critical edge:"
+ " BB#" << A->getNumber()
+ << " -- BB#" << NewNum
+ << " -- BB#" << B->getNumber() << '\n');
+
+ A->ReplaceUsesOfBlockWith(B, NMBB);
+ NMBB->addSuccessor(B);
+
+ // Insert unconditional "jump B" instruction in NMBB.
+ SmallVector<MachineOperand, 4> Cond;
+ MF->getTarget().getInstrInfo()->InsertBranch(*NMBB, B, NULL, Cond);
+
+ LiveVariables *LV = getAnalysisIfAvailable<LiveVariables>();
+ if (LV)
+ LV->addNewBlock(NMBB, B);
+
+ // Fix PHI nodes in B so they refer to NMBB instead of A
+ for (MachineBasicBlock::iterator i = B->begin(), e = B->end();
+ i != e && i->getOpcode() == TargetInstrInfo::PHI; ++i)
+ for (unsigned ni = 1, ne = i->getNumOperands(); ni != ne; ni += 2)
+ if (i->getOperand(ni+1).getMBB() == A) {
+ i->getOperand(ni+1).setMBB(NMBB);
+ // Mark PHI sources as passing live through NMBB
+ if (LV)
+ LV->getVarInfo(i->getOperand(ni).getReg()).AliveBlocks.set(NewNum);
+ }
+ return NMBB;
+}
+
+