Sink SelectionDAGBuilder's HandlePHINodesInSuccessorBlocks down

into SelectionDAGBuilder itself.

llvm-svn: 102128
This commit is contained in:
Dan Gohman 2010-04-22 20:55:53 +00:00
parent ea2744f4dc
commit 5b43aa0ddd
3 changed files with 7 additions and 15 deletions

View File

@ -615,6 +615,10 @@ void SelectionDAGBuilder::AssignOrderingToNode(const SDNode *Node) {
} }
void SelectionDAGBuilder::visit(const Instruction &I) { void SelectionDAGBuilder::visit(const Instruction &I) {
// Set up outgoing PHI node register values before emitting the terminator.
if (isa<TerminatorInst>(&I))
HandlePHINodesInSuccessorBlocks(I.getParent());
CurDebugLoc = I.getDebugLoc(); CurDebugLoc = I.getDebugLoc();
visit(I.getOpcode(), I); visit(I.getOpcode(), I);

View File

@ -369,8 +369,6 @@ public:
void LowerCallTo(ImmutableCallSite CS, SDValue Callee, bool IsTailCall, void LowerCallTo(ImmutableCallSite CS, SDValue Callee, bool IsTailCall,
MachineBasicBlock *LandingPad = NULL); MachineBasicBlock *LandingPad = NULL);
void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
private: private:
// Terminator instructions. // Terminator instructions.
void visitRet(const ReturnInst &I); void visitRet(const ReturnInst &I);
@ -495,6 +493,8 @@ private:
const char *implVisitBinaryAtomic(const CallInst& I, ISD::NodeType Op); const char *implVisitBinaryAtomic(const CallInst& I, ISD::NodeType Op);
const char *implVisitAluOverflow(const CallInst &I, ISD::NodeType Op); const char *implVisitAluOverflow(const CallInst &I, ISD::NodeType Op);
void HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
}; };
} // end namespace llvm } // end namespace llvm

View File

@ -233,21 +233,9 @@ SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB,
// Lower all of the non-terminator instructions. If a call is emitted // Lower all of the non-terminator instructions. If a call is emitted
// as a tail call, cease emitting nodes for this block. Terminators // as a tail call, cease emitting nodes for this block. Terminators
// are handled below. // are handled below.
for (BasicBlock::const_iterator I = Begin; for (BasicBlock::const_iterator I = Begin; I != End && !SDB->HasTailCall; ++I)
I != End && !SDB->HasTailCall && !isa<TerminatorInst>(I);
++I)
SDB->visit(*I); SDB->visit(*I);
if (!SDB->HasTailCall) {
// Handle PHI nodes in successor blocks.
if (End == LLVMBB->end()) {
SDB->HandlePHINodesInSuccessorBlocks(LLVMBB);
// Lower the terminator after the copies are emitted.
SDB->visit(*LLVMBB->getTerminator());
}
}
// Make sure the root of the DAG is up-to-date. // Make sure the root of the DAG is up-to-date.
CurDAG->setRoot(SDB->getControlRoot()); CurDAG->setRoot(SDB->getControlRoot());