mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-14 23:48:49 +00:00
Move PHINodesToUpdate out of SelectionDAGBuilder and into
FunctionLoweringInfo, as it isn't SelectionDAG-specific. This isn't completely natural, as PHI node state is not per-function but rather per-basic-block, however there's currently no other convenient per-basic-block state to group it with. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102109 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f1dabde404
commit
620427d5a1
@ -35,6 +35,7 @@ class CallInst;
|
||||
class Function;
|
||||
class GlobalVariable;
|
||||
class Instruction;
|
||||
class MachineInstr;
|
||||
class MachineBasicBlock;
|
||||
class MachineFunction;
|
||||
class MachineModuleInfo;
|
||||
@ -89,6 +90,12 @@ public:
|
||||
/// register number offset by 'FirstVirtualRegister'.
|
||||
std::vector<LiveOutInfo> LiveOutRegInfo;
|
||||
|
||||
/// PHINodesToUpdate - A list of phi instructions whose operand list will
|
||||
/// be updated after processing the current basic block.
|
||||
/// TODO: This isn't per-function state, it's per-basic-block state. But
|
||||
/// there's no other convenient place for it to live right now.
|
||||
std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
|
||||
|
||||
explicit FunctionLoweringInfo(const TargetLowering &TLI);
|
||||
|
||||
/// set - Initialize this FunctionLoweringInfo with the given Function
|
||||
|
@ -6019,7 +6019,7 @@ SelectionDAGISel::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
EVT VT = ValueVTs[vti];
|
||||
unsigned NumRegisters = TLI.getNumRegisters(*CurDAG->getContext(), VT);
|
||||
for (unsigned i = 0, e = NumRegisters; i != e; ++i)
|
||||
SDB->PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i));
|
||||
FuncInfo->PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i));
|
||||
Reg += NumRegisters;
|
||||
}
|
||||
}
|
||||
@ -6037,7 +6037,7 @@ SelectionDAGISel::HandlePHINodesInSuccessorBlocksFast(const BasicBlock *LLVMBB,
|
||||
const TerminatorInst *TI = LLVMBB->getTerminator();
|
||||
|
||||
SmallPtrSet<MachineBasicBlock *, 4> SuccsHandled;
|
||||
unsigned OrigNumPHINodesToUpdate = SDB->PHINodesToUpdate.size();
|
||||
unsigned OrigNumPHINodesToUpdate = FuncInfo->PHINodesToUpdate.size();
|
||||
|
||||
// Check successor nodes' PHI nodes that expect a constant to be available
|
||||
// from this block.
|
||||
@ -6072,7 +6072,7 @@ SelectionDAGISel::HandlePHINodesInSuccessorBlocksFast(const BasicBlock *LLVMBB,
|
||||
if (VT == MVT::i1)
|
||||
VT = TLI.getTypeToTransformTo(*CurDAG->getContext(), VT);
|
||||
else {
|
||||
SDB->PHINodesToUpdate.resize(OrigNumPHINodesToUpdate);
|
||||
FuncInfo->PHINodesToUpdate.resize(OrigNumPHINodesToUpdate);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -6081,10 +6081,10 @@ SelectionDAGISel::HandlePHINodesInSuccessorBlocksFast(const BasicBlock *LLVMBB,
|
||||
|
||||
unsigned Reg = F->getRegForValue(PHIOp);
|
||||
if (Reg == 0) {
|
||||
SDB->PHINodesToUpdate.resize(OrigNumPHINodesToUpdate);
|
||||
FuncInfo->PHINodesToUpdate.resize(OrigNumPHINodesToUpdate);
|
||||
return false;
|
||||
}
|
||||
SDB->PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg));
|
||||
FuncInfo->PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -271,10 +271,6 @@ public:
|
||||
/// SwitchInst code generation information.
|
||||
std::vector<BitTestBlock> BitTestCases;
|
||||
|
||||
/// PHINodesToUpdate - A list of phi instructions whose operand list will
|
||||
/// be updated after processing the current basic block.
|
||||
std::vector<std::pair<MachineInstr*, unsigned> > PHINodesToUpdate;
|
||||
|
||||
/// EdgeMapping - If an edge from CurMBB to any MBB is changed (e.g. due to
|
||||
/// scheduler custom lowering), track the change here.
|
||||
DenseMap<MachineBasicBlock*, MachineBasicBlock*> EdgeMapping;
|
||||
|
@ -835,6 +835,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
}
|
||||
|
||||
FinishBasicBlock(BB);
|
||||
FuncInfo->PHINodesToUpdate.clear();
|
||||
}
|
||||
|
||||
delete FastIS;
|
||||
@ -847,28 +848,27 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
DEBUG(BB->dump());
|
||||
|
||||
DEBUG(dbgs() << "Total amount of phi nodes to update: "
|
||||
<< SDB->PHINodesToUpdate.size() << "\n");
|
||||
DEBUG(for (unsigned i = 0, e = SDB->PHINodesToUpdate.size(); i != e; ++i)
|
||||
<< FuncInfo->PHINodesToUpdate.size() << "\n");
|
||||
DEBUG(for (unsigned i = 0, e = FuncInfo->PHINodesToUpdate.size(); i != e; ++i)
|
||||
dbgs() << "Node " << i << " : ("
|
||||
<< SDB->PHINodesToUpdate[i].first
|
||||
<< ", " << SDB->PHINodesToUpdate[i].second << ")\n");
|
||||
<< FuncInfo->PHINodesToUpdate[i].first
|
||||
<< ", " << FuncInfo->PHINodesToUpdate[i].second << ")\n");
|
||||
|
||||
// Next, now that we know what the last MBB the LLVM BB expanded is, update
|
||||
// PHI nodes in successors.
|
||||
if (SDB->SwitchCases.empty() &&
|
||||
SDB->JTCases.empty() &&
|
||||
SDB->BitTestCases.empty()) {
|
||||
for (unsigned i = 0, e = SDB->PHINodesToUpdate.size(); i != e; ++i) {
|
||||
MachineInstr *PHI = SDB->PHINodesToUpdate[i].first;
|
||||
for (unsigned i = 0, e = FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
|
||||
MachineInstr *PHI = FuncInfo->PHINodesToUpdate[i].first;
|
||||
assert(PHI->isPHI() &&
|
||||
"This is not a machine PHI node that we are updating!");
|
||||
if (!BB->isSuccessor(PHI->getParent()))
|
||||
continue;
|
||||
PHI->addOperand(MachineOperand::CreateReg(SDB->PHINodesToUpdate[i].second,
|
||||
false));
|
||||
PHI->addOperand(
|
||||
MachineOperand::CreateReg(FuncInfo->PHINodesToUpdate[i].second, false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(BB));
|
||||
}
|
||||
SDB->PHINodesToUpdate.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
@ -906,8 +906,9 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
}
|
||||
|
||||
// Update PHI Nodes
|
||||
for (unsigned pi = 0, pe = SDB->PHINodesToUpdate.size(); pi != pe; ++pi) {
|
||||
MachineInstr *PHI = SDB->PHINodesToUpdate[pi].first;
|
||||
for (unsigned pi = 0, pe = FuncInfo->PHINodesToUpdate.size();
|
||||
pi != pe; ++pi) {
|
||||
MachineInstr *PHI = FuncInfo->PHINodesToUpdate[pi].first;
|
||||
MachineBasicBlock *PHIBB = PHI->getParent();
|
||||
assert(PHI->isPHI() &&
|
||||
"This is not a machine PHI node that we are updating!");
|
||||
@ -915,10 +916,12 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
// from last "case" BB.
|
||||
if (PHIBB == SDB->BitTestCases[i].Default) {
|
||||
PHI->addOperand(MachineOperand::
|
||||
CreateReg(SDB->PHINodesToUpdate[pi].second, false));
|
||||
CreateReg(FuncInfo->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(SDB->BitTestCases[i].Parent));
|
||||
PHI->addOperand(MachineOperand::
|
||||
CreateReg(SDB->PHINodesToUpdate[pi].second, false));
|
||||
CreateReg(FuncInfo->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(SDB->BitTestCases[i].Cases.
|
||||
back().ThisBB));
|
||||
}
|
||||
@ -928,7 +931,8 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
MachineBasicBlock* cBB = SDB->BitTestCases[i].Cases[j].ThisBB;
|
||||
if (cBB->isSuccessor(PHIBB)) {
|
||||
PHI->addOperand(MachineOperand::
|
||||
CreateReg(SDB->PHINodesToUpdate[pi].second, false));
|
||||
CreateReg(FuncInfo->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(cBB));
|
||||
}
|
||||
}
|
||||
@ -961,22 +965,25 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
SDB->clear();
|
||||
|
||||
// Update PHI Nodes
|
||||
for (unsigned pi = 0, pe = SDB->PHINodesToUpdate.size(); pi != pe; ++pi) {
|
||||
MachineInstr *PHI = SDB->PHINodesToUpdate[pi].first;
|
||||
for (unsigned pi = 0, pe = FuncInfo->PHINodesToUpdate.size();
|
||||
pi != pe; ++pi) {
|
||||
MachineInstr *PHI = FuncInfo->PHINodesToUpdate[pi].first;
|
||||
MachineBasicBlock *PHIBB = PHI->getParent();
|
||||
assert(PHI->isPHI() &&
|
||||
"This is not a machine PHI node that we are updating!");
|
||||
// "default" BB. We can go there only from header BB.
|
||||
if (PHIBB == SDB->JTCases[i].second.Default) {
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateReg(SDB->PHINodesToUpdate[pi].second, false));
|
||||
(MachineOperand::CreateReg(FuncInfo->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateMBB(SDB->JTCases[i].first.HeaderBB));
|
||||
}
|
||||
// JT BB. Just iterate over successors here
|
||||
if (BB->isSuccessor(PHIBB)) {
|
||||
PHI->addOperand
|
||||
(MachineOperand::CreateReg(SDB->PHINodesToUpdate[pi].second, false));
|
||||
(MachineOperand::CreateReg(FuncInfo->PHINodesToUpdate[pi].second,
|
||||
false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(BB));
|
||||
}
|
||||
}
|
||||
@ -985,13 +992,13 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
|
||||
// If the switch block involved a branch to one of the actual successors, we
|
||||
// need to update PHI nodes in that block.
|
||||
for (unsigned i = 0, e = SDB->PHINodesToUpdate.size(); i != e; ++i) {
|
||||
MachineInstr *PHI = SDB->PHINodesToUpdate[i].first;
|
||||
for (unsigned i = 0, e = FuncInfo->PHINodesToUpdate.size(); i != e; ++i) {
|
||||
MachineInstr *PHI = FuncInfo->PHINodesToUpdate[i].first;
|
||||
assert(PHI->isPHI() &&
|
||||
"This is not a machine PHI node that we are updating!");
|
||||
if (BB->isSuccessor(PHI->getParent())) {
|
||||
PHI->addOperand(MachineOperand::CreateReg(SDB->PHINodesToUpdate[i].second,
|
||||
false));
|
||||
PHI->addOperand(
|
||||
MachineOperand::CreateReg(FuncInfo->PHINodesToUpdate[i].second, false));
|
||||
PHI->addOperand(MachineOperand::CreateMBB(BB));
|
||||
}
|
||||
}
|
||||
@ -1027,11 +1034,11 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
++Phi) {
|
||||
// This value for this PHI node is recorded in PHINodesToUpdate.
|
||||
for (unsigned pn = 0; ; ++pn) {
|
||||
assert(pn != SDB->PHINodesToUpdate.size() &&
|
||||
assert(pn != FuncInfo->PHINodesToUpdate.size() &&
|
||||
"Didn't find PHI entry!");
|
||||
if (SDB->PHINodesToUpdate[pn].first == Phi) {
|
||||
if (FuncInfo->PHINodesToUpdate[pn].first == Phi) {
|
||||
Phi->addOperand(MachineOperand::
|
||||
CreateReg(SDB->PHINodesToUpdate[pn].second,
|
||||
CreateReg(FuncInfo->PHINodesToUpdate[pn].second,
|
||||
false));
|
||||
Phi->addOperand(MachineOperand::CreateMBB(ThisBB));
|
||||
break;
|
||||
@ -1052,8 +1059,6 @@ SelectionDAGISel::FinishBasicBlock(MachineBasicBlock *BB) {
|
||||
SDB->clear();
|
||||
}
|
||||
SDB->SwitchCases.clear();
|
||||
|
||||
SDB->PHINodesToUpdate.clear();
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user