mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Handle recursive PHI's.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90575 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -38,7 +38,7 @@ TailDuplicateSize("tail-dup-size",
|
|||||||
cl::desc("Maximum instructions to consider tail duplicating"),
|
cl::desc("Maximum instructions to consider tail duplicating"),
|
||||||
cl::init(2), cl::Hidden);
|
cl::init(2), cl::Hidden);
|
||||||
|
|
||||||
typedef std::vector<unsigned> AvailableValsTy;
|
typedef std::vector<std::pair<MachineBasicBlock*,unsigned> > AvailableValsTy;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
/// TailDuplicatePass - Perform tail duplication.
|
/// TailDuplicatePass - Perform tail duplication.
|
||||||
@@ -64,7 +64,8 @@ namespace {
|
|||||||
virtual const char *getPassName() const { return "Tail Duplication"; }
|
virtual const char *getPassName() const { return "Tail Duplication"; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg);
|
void AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
|
||||||
|
MachineBasicBlock *BB);
|
||||||
void ProcessPHI(MachineInstr *MI, MachineBasicBlock *TailBB,
|
void ProcessPHI(MachineInstr *MI, MachineBasicBlock *TailBB,
|
||||||
MachineBasicBlock *PredBB,
|
MachineBasicBlock *PredBB,
|
||||||
DenseMap<unsigned, unsigned> &LocalVRMap);
|
DenseMap<unsigned, unsigned> &LocalVRMap);
|
||||||
@@ -151,14 +152,14 @@ static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB) {
|
|||||||
|
|
||||||
/// AddSSAUpdateEntry - Add a definition and source virtual registers pair for
|
/// AddSSAUpdateEntry - Add a definition and source virtual registers pair for
|
||||||
/// SSA update.
|
/// SSA update.
|
||||||
void TailDuplicatePass::AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg) {
|
void TailDuplicatePass::AddSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
|
||||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
MachineBasicBlock *BB) {
|
||||||
SSAUpdateVals.find(OrigReg);
|
DenseMap<unsigned, AvailableValsTy>::iterator LI= SSAUpdateVals.find(OrigReg);
|
||||||
if (LI != SSAUpdateVals.end())
|
if (LI != SSAUpdateVals.end())
|
||||||
LI->second.push_back(NewReg);
|
LI->second.push_back(std::make_pair(BB, NewReg));
|
||||||
else {
|
else {
|
||||||
AvailableValsTy Vals;
|
AvailableValsTy Vals;
|
||||||
Vals.push_back(NewReg);
|
Vals.push_back(std::make_pair(BB, NewReg));
|
||||||
SSAUpdateVals.insert(std::make_pair(OrigReg, Vals));
|
SSAUpdateVals.insert(std::make_pair(OrigReg, Vals));
|
||||||
SSAUpdateVRs.push_back(OrigReg);
|
SSAUpdateVRs.push_back(OrigReg);
|
||||||
}
|
}
|
||||||
@@ -176,7 +177,7 @@ void TailDuplicatePass::ProcessPHI(MachineInstr *MI,
|
|||||||
unsigned SrcReg = MI->getOperand(SrcOpIdx).getReg();
|
unsigned SrcReg = MI->getOperand(SrcOpIdx).getReg();
|
||||||
LocalVRMap.insert(std::make_pair(DefReg, SrcReg));
|
LocalVRMap.insert(std::make_pair(DefReg, SrcReg));
|
||||||
if (isDefLiveOut(DefReg, TailBB, MRI))
|
if (isDefLiveOut(DefReg, TailBB, MRI))
|
||||||
AddSSAUpdateEntry(DefReg, SrcReg);
|
AddSSAUpdateEntry(DefReg, SrcReg, PredBB);
|
||||||
|
|
||||||
// Remove PredBB from the PHI node.
|
// Remove PredBB from the PHI node.
|
||||||
MI->RemoveOperand(SrcOpIdx+1);
|
MI->RemoveOperand(SrcOpIdx+1);
|
||||||
@@ -206,7 +207,7 @@ void TailDuplicatePass::DuplicateInstruction(MachineInstr *MI,
|
|||||||
MO.setReg(NewReg);
|
MO.setReg(NewReg);
|
||||||
LocalVRMap.insert(std::make_pair(Reg, NewReg));
|
LocalVRMap.insert(std::make_pair(Reg, NewReg));
|
||||||
if (isDefLiveOut(Reg, TailBB, MRI))
|
if (isDefLiveOut(Reg, TailBB, MRI))
|
||||||
AddSSAUpdateEntry(Reg, NewReg);
|
AddSSAUpdateEntry(Reg, NewReg, PredBB);
|
||||||
} else {
|
} else {
|
||||||
DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
|
DenseMap<unsigned, unsigned>::iterator VI = LocalVRMap.find(Reg);
|
||||||
if (VI != LocalVRMap.end())
|
if (VI != LocalVRMap.end())
|
||||||
@@ -240,15 +241,14 @@ void TailDuplicatePass::UpdateSuccessorsPHIs(MachineBasicBlock *FromBB,
|
|||||||
II->RemoveOperand(i+1);
|
II->RemoveOperand(i+1);
|
||||||
II->RemoveOperand(i);
|
II->RemoveOperand(i);
|
||||||
}
|
}
|
||||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
DenseMap<unsigned,AvailableValsTy>::iterator LI=SSAUpdateVals.find(Reg);
|
||||||
SSAUpdateVals.find(Reg);
|
|
||||||
if (LI == SSAUpdateVals.end())
|
if (LI == SSAUpdateVals.end())
|
||||||
break;
|
break;
|
||||||
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
||||||
unsigned NewReg = LI->second[j];
|
MachineBasicBlock *SrcBB = LI->second[j].first;
|
||||||
MachineInstr *DefMI = MRI->getVRegDef(NewReg);
|
unsigned SrcReg = LI->second[j].second;
|
||||||
II->addOperand(MachineOperand::CreateReg(NewReg, false));
|
II->addOperand(MachineOperand::CreateReg(SrcReg, false));
|
||||||
II->addOperand(MachineOperand::CreateMBB(DefMI->getParent()));
|
II->addOperand(MachineOperand::CreateMBB(SrcBB));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -449,9 +449,9 @@ bool TailDuplicatePass::TailDuplicate(MachineBasicBlock *TailBB,
|
|||||||
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
DenseMap<unsigned, AvailableValsTy>::iterator LI =
|
||||||
SSAUpdateVals.find(VReg);
|
SSAUpdateVals.find(VReg);
|
||||||
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
|
||||||
unsigned NewReg = LI->second[j];
|
MachineBasicBlock *SrcBB = LI->second[j].first;
|
||||||
MachineInstr *DefMI = MRI->getVRegDef(NewReg);
|
unsigned SrcReg = LI->second[j].second;
|
||||||
SSAUpdate.AddAvailableValue(DefMI->getParent(), NewReg);
|
SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite uses that are outside of the original def's block.
|
// Rewrite uses that are outside of the original def's block.
|
||||||
|
Reference in New Issue
Block a user