1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 19:12:56 +02:00

A little more progress on StrongPHIElimination, now that I have a better sense of

how the CodeGen machinery works.

llvm-svn: 44786
This commit is contained in:
Owen Anderson 2007-12-10 08:07:09 +00:00
parent 5c577eb543
commit 4bd6d18e18

View File

@ -39,6 +39,9 @@ namespace {
static char ID; // Pass identification, replacement for typeid
StrongPHIElimination() : MachineFunctionPass((intptr_t)&ID) {}
DenseMap<MachineBasicBlock*,
SmallVector<std::pair<unsigned, unsigned>, 2> > Waiting;
bool runOnMachineFunction(MachineFunction &Fn);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
@ -263,6 +266,8 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
while (P->getOpcode() == TargetInstrInfo::PHI) {
LiveVariables::VarInfo& PHIInfo = LV.getVarInfo(P->getOperand(0).getReg());
unsigned DestReg = P->getOperand(0).getReg();
// Hold the names that are currently in the candidate set.
std::set<unsigned> PHIUnion;
std::set<MachineBasicBlock*> UnionedBlocks;
@ -271,17 +276,17 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
unsigned SrcReg = P->getOperand(i-1).getReg();
LiveVariables::VarInfo& SrcInfo = LV.getVarInfo(SrcReg);
if (isLiveIn(SrcInfo, P->getParent())) {
// Check for trivial interferences
if (isLiveIn(SrcInfo, P->getParent()) ||
isLiveOut(PHIInfo, SrcInfo.DefInst->getParent()) ||
( PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
isLiveIn(PHIInfo, SrcInfo.DefInst->getParent()) ) ||
ProcessedNames.count(SrcReg) ||
UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
// add a copy from a_i to p in Waiting[From[a_i]]
} else if (isLiveOut(PHIInfo, SrcInfo.DefInst->getParent())) {
// add a copy to Waiting[From[a_i]]
} else if (PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
isLiveIn(PHIInfo, SrcInfo.DefInst->getParent())) {
// add a copy to Waiting[From[a_i]]
} else if (ProcessedNames.count(SrcReg)) {
// add a copy to Waiting[From[a_i]]
} else if (UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
// add a copy to Waiting[From[a_i]]
MachineBasicBlock* From = P->getOperand(i).getMachineBasicBlock();
Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
} else {
PHIUnion.insert(SrcReg);
UnionedBlocks.insert(SrcInfo.DefInst->getParent());
@ -291,7 +296,7 @@ void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
std::vector<StrongPHIElimination::DomForestNode*> DF =
computeDomForest(PHIUnion);
// DO STUFF HERE
// Walk DomForest to resolve interferences
ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
++P;