Reapply the removal of SelectionDAGISel's BB, with a fix for the case

where multiple blocks are emitted; functions which do this need to return
the new BB so that their callers can stay current.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101843 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman 2010-04-20 00:29:35 +00:00
parent 02170c0034
commit a9a3321938
2 changed files with 28 additions and 24 deletions

View File

@ -46,7 +46,6 @@ public:
MachineRegisterInfo *RegInfo; MachineRegisterInfo *RegInfo;
SelectionDAG *CurDAG; SelectionDAG *CurDAG;
SelectionDAGBuilder *SDB; SelectionDAGBuilder *SDB;
MachineBasicBlock *BB;
AliasAnalysis *AA; AliasAnalysis *AA;
GCFunctionInfo *GFI; GCFunctionInfo *GFI;
CodeGenOpt::Level OptLevel; CodeGenOpt::Level OptLevel;
@ -283,13 +282,14 @@ private:
void PrepareEHLandingPad(MachineBasicBlock *BB); void PrepareEHLandingPad(MachineBasicBlock *BB);
void SelectAllBasicBlocks(const Function &Fn); void SelectAllBasicBlocks(const Function &Fn);
void FinishBasicBlock(); void FinishBasicBlock(MachineBasicBlock *BB);
void SelectBasicBlock(const BasicBlock *LLVMBB, MachineBasicBlock *SelectBasicBlock(MachineBasicBlock *BB,
BasicBlock::const_iterator Begin, const BasicBlock *LLVMBB,
BasicBlock::const_iterator End, BasicBlock::const_iterator Begin,
bool &HadTailCall); BasicBlock::const_iterator End,
void CodeGenAndEmitDAG(); bool &HadTailCall);
MachineBasicBlock *CodeGenAndEmitDAG(MachineBasicBlock *BB);
void LowerArguments(const BasicBlock *BB); void LowerArguments(const BasicBlock *BB);
void ShrinkDemandedOps(); void ShrinkDemandedOps();

View File

@ -249,10 +249,12 @@ static void ResetDebugLoc(SelectionDAGBuilder *SDB, FastISel *FastIS) {
FastIS->setCurDebugLoc(DebugLoc()); FastIS->setCurDebugLoc(DebugLoc());
} }
void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB, MachineBasicBlock *
BasicBlock::const_iterator Begin, SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB,
BasicBlock::const_iterator End, const BasicBlock *LLVMBB,
bool &HadTailCall) { BasicBlock::const_iterator Begin,
BasicBlock::const_iterator End,
bool &HadTailCall) {
// 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.
@ -286,9 +288,10 @@ void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB,
CurDAG->setRoot(SDB->getControlRoot()); CurDAG->setRoot(SDB->getControlRoot());
// Final step, emit the lowered DAG as machine code. // Final step, emit the lowered DAG as machine code.
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
HadTailCall = SDB->HasTailCall; HadTailCall = SDB->HasTailCall;
SDB->clear(); SDB->clear();
return BB;
} }
namespace { namespace {
@ -473,7 +476,7 @@ void SelectionDAGISel::ComputeLiveOutVRegInfo() {
} while (!Worklist.empty()); } while (!Worklist.empty());
} }
void SelectionDAGISel::CodeGenAndEmitDAG() { MachineBasicBlock *SelectionDAGISel::CodeGenAndEmitDAG(MachineBasicBlock *BB) {
std::string GroupName; std::string GroupName;
if (TimePassesIsEnabled) if (TimePassesIsEnabled)
GroupName = "Instruction Selection and Scheduling"; GroupName = "Instruction Selection and Scheduling";
@ -638,6 +641,7 @@ void SelectionDAGISel::CodeGenAndEmitDAG() {
DEBUG(dbgs() << "Selected machine code:\n"); DEBUG(dbgs() << "Selected machine code:\n");
DEBUG(BB->dump()); DEBUG(BB->dump());
return BB;
} }
void SelectionDAGISel::DoInstructionSelection() { void SelectionDAGISel::DoInstructionSelection() {
@ -754,7 +758,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
// Iterate over all basic blocks in the function. // Iterate over all basic blocks in the function.
for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { for (Function::const_iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
const BasicBlock *LLVMBB = &*I; const BasicBlock *LLVMBB = &*I;
BB = FuncInfo->MBBMap[LLVMBB]; MachineBasicBlock *BB = FuncInfo->MBBMap[LLVMBB];
BasicBlock::const_iterator const Begin = LLVMBB->begin(); BasicBlock::const_iterator const Begin = LLVMBB->begin();
BasicBlock::const_iterator const End = LLVMBB->end(); BasicBlock::const_iterator const End = LLVMBB->end();
@ -790,7 +794,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
// beginning FastISel on the entry block. // beginning FastISel on the entry block.
if (LLVMBB == &Fn.getEntryBlock()) { if (LLVMBB == &Fn.getEntryBlock()) {
CurDAG->setRoot(SDB->getControlRoot()); CurDAG->setRoot(SDB->getControlRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
SDB->clear(); SDB->clear();
} }
FastIS->startNewBlock(BB); FastIS->startNewBlock(BB);
@ -838,7 +842,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
} }
bool HadTailCall = false; bool HadTailCall = false;
SelectBasicBlock(LLVMBB, BI, llvm::next(BI), HadTailCall); BB = SelectBasicBlock(BB, LLVMBB, BI, llvm::next(BI), HadTailCall);
// If the call was emitted as a tail call, we're done with the block. // If the call was emitted as a tail call, we're done with the block.
if (HadTailCall) { if (HadTailCall) {
@ -874,17 +878,17 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
// block. // block.
if (BI != End) { if (BI != End) {
bool HadTailCall; bool HadTailCall;
SelectBasicBlock(LLVMBB, BI, End, HadTailCall); BB = SelectBasicBlock(BB, LLVMBB, BI, End, HadTailCall);
} }
FinishBasicBlock(); FinishBasicBlock(BB);
} }
delete FastIS; delete FastIS;
} }
void void
SelectionDAGISel::FinishBasicBlock() { SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
DEBUG(dbgs() << "Target-post-processed machine code:\n"); DEBUG(dbgs() << "Target-post-processed machine code:\n");
DEBUG(BB->dump()); DEBUG(BB->dump());
@ -923,7 +927,7 @@ SelectionDAGISel::FinishBasicBlock() {
// Emit the code // Emit the code
SDB->visitBitTestHeader(SDB->BitTestCases[i], BB); SDB->visitBitTestHeader(SDB->BitTestCases[i], BB);
CurDAG->setRoot(SDB->getRoot()); CurDAG->setRoot(SDB->getRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
SDB->clear(); SDB->clear();
} }
@ -944,7 +948,7 @@ SelectionDAGISel::FinishBasicBlock() {
CurDAG->setRoot(SDB->getRoot()); CurDAG->setRoot(SDB->getRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
SDB->clear(); SDB->clear();
} }
@ -991,7 +995,7 @@ SelectionDAGISel::FinishBasicBlock() {
SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first, SDB->visitJumpTableHeader(SDB->JTCases[i].second, SDB->JTCases[i].first,
BB); BB);
CurDAG->setRoot(SDB->getRoot()); CurDAG->setRoot(SDB->getRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
SDB->clear(); SDB->clear();
} }
@ -1000,7 +1004,7 @@ SelectionDAGISel::FinishBasicBlock() {
// Emit the code // Emit the code
SDB->visitJumpTable(SDB->JTCases[i].second); SDB->visitJumpTable(SDB->JTCases[i].second);
CurDAG->setRoot(SDB->getRoot()); CurDAG->setRoot(SDB->getRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
SDB->clear(); SDB->clear();
// Update PHI Nodes // Update PHI Nodes
@ -1048,7 +1052,7 @@ SelectionDAGISel::FinishBasicBlock() {
// Emit the code // Emit the code
SDB->visitSwitchCase(SDB->SwitchCases[i], BB); SDB->visitSwitchCase(SDB->SwitchCases[i], BB);
CurDAG->setRoot(SDB->getRoot()); CurDAG->setRoot(SDB->getRoot());
CodeGenAndEmitDAG(); BB = CodeGenAndEmitDAG(BB);
// Handle any PHI nodes in successors of this chunk, as if we were coming // Handle any PHI nodes in successors of this chunk, as if we were coming
// from the original BB before switch expansion. Note that PHI nodes can // from the original BB before switch expansion. Note that PHI nodes can