mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-03 08:55:51 +00:00
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:
parent
02170c0034
commit
a9a3321938
@ -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,
|
||||||
|
const BasicBlock *LLVMBB,
|
||||||
BasicBlock::const_iterator Begin,
|
BasicBlock::const_iterator Begin,
|
||||||
BasicBlock::const_iterator End,
|
BasicBlock::const_iterator End,
|
||||||
bool &HadTailCall);
|
bool &HadTailCall);
|
||||||
void CodeGenAndEmitDAG();
|
MachineBasicBlock *CodeGenAndEmitDAG(MachineBasicBlock *BB);
|
||||||
void LowerArguments(const BasicBlock *BB);
|
void LowerArguments(const BasicBlock *BB);
|
||||||
|
|
||||||
void ShrinkDemandedOps();
|
void ShrinkDemandedOps();
|
||||||
|
@ -249,7 +249,9 @@ static void ResetDebugLoc(SelectionDAGBuilder *SDB, FastISel *FastIS) {
|
|||||||
FastIS->setCurDebugLoc(DebugLoc());
|
FastIS->setCurDebugLoc(DebugLoc());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDAGISel::SelectBasicBlock(const BasicBlock *LLVMBB,
|
MachineBasicBlock *
|
||||||
|
SelectionDAGISel::SelectBasicBlock(MachineBasicBlock *BB,
|
||||||
|
const BasicBlock *LLVMBB,
|
||||||
BasicBlock::const_iterator Begin,
|
BasicBlock::const_iterator Begin,
|
||||||
BasicBlock::const_iterator End,
|
BasicBlock::const_iterator End,
|
||||||
bool &HadTailCall) {
|
bool &HadTailCall) {
|
||||||
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user