diff options
author | Owen Anderson <resistor@mac.com> | 2007-12-10 08:07:09 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-12-10 08:07:09 +0000 |
commit | afc6de0015bbeb33a87faa6548c1289d649e832e (patch) | |
tree | bf9e8258c681f581faa9132cc2177e7c6acc859e | |
parent | 11a4f64bd4cb6d438dd4b5882ee1b7404832f27f (diff) | |
download | external_llvm-afc6de0015bbeb33a87faa6548c1289d649e832e.zip external_llvm-afc6de0015bbeb33a87faa6548c1289d649e832e.tar.gz external_llvm-afc6de0015bbeb33a87faa6548c1289d649e832e.tar.bz2 |
A little more progress on StrongPHIElimination, now that I have a better sense of
how the CodeGen machinery works.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44786 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/StrongPHIElimination.cpp | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index d023b59..fa7c10c 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -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; |