From 4e369a14db0b38ecd3ca9c57433c68263cd59190 Mon Sep 17 00:00:00 2001 From: Owen Anderson <resistor@mac.com> Date: Mon, 10 Dec 2007 08:07:09 +0000 Subject: 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 --- lib/CodeGen/StrongPHIElimination.cpp | 27 ++++++++++++++++----------- 1 file 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; -- cgit v1.1