diff --git a/lib/CodeGen/StrongPHIElimination.cpp b/lib/CodeGen/StrongPHIElimination.cpp index 51a2ef944d0..c5e9c343fc7 100644 --- a/lib/CodeGen/StrongPHIElimination.cpp +++ b/lib/CodeGen/StrongPHIElimination.cpp @@ -59,14 +59,14 @@ namespace { struct DomForestNode { private: std::vector children; - MachineInstr* instr; + unsigned reg; void addChild(DomForestNode* DFN) { children.push_back(DFN); } public: typedef std::vector::iterator iterator; - DomForestNode(MachineInstr* MI, DomForestNode* parent) : instr(MI) { + DomForestNode(unsigned r, DomForestNode* parent) : reg(r) { if (parent) parent->addChild(this); } @@ -76,7 +76,7 @@ namespace { delete *I; } - inline MachineInstr* getInstr() { return instr; } + inline unsigned getReg() { return reg; } inline DomForestNode::iterator begin() { return children.begin(); } inline DomForestNode::iterator end() { return children.end(); } @@ -89,9 +89,9 @@ namespace { void computeDFS(MachineFunction& MF); + void processPHI(MachineInstr* P); - std::vector - computeDomForest(SmallPtrSet& instrs); + std::vector computeDomForest(std::set& instrs); }; @@ -149,51 +149,60 @@ void StrongPHIElimination::computeDFS(MachineFunction& MF) { class PreorderSorter { private: DenseMap& preorder; + LiveVariables& LV; public: - PreorderSorter(DenseMap& p) : preorder(p) { } + PreorderSorter(DenseMap& p, + LiveVariables& L) : preorder(p), LV(L) { } - bool operator()(MachineInstr* A, MachineInstr* B) { + bool operator()(unsigned A, unsigned B) { if (A == B) return false; - if (preorder[A->getParent()] < preorder[B->getParent()]) + MachineBasicBlock* ABlock = LV.getVarInfo(A).DefInst->getParent(); + MachineBasicBlock* BBlock = LV.getVarInfo(A).DefInst->getParent(); + + if (preorder[ABlock] < preorder[BBlock]) return true; - else if (preorder[A->getParent()] > preorder[B->getParent()]) + else if (preorder[ABlock] > preorder[BBlock]) return false; - if (A->getOpcode() == TargetInstrInfo::PHI && - B->getOpcode() == TargetInstrInfo::PHI) - return A < B; - - MachineInstr* begin = A->getParent()->begin(); - return std::distance(begin, A) < std::distance(begin, B); + assert(0 && "Error sorting by dominance!"); + return false; } }; std::vector -StrongPHIElimination::computeDomForest(SmallPtrSet& instrs) { +StrongPHIElimination::computeDomForest(std::set& regs) { + LiveVariables& LV = getAnalysis(); + DomForestNode* VirtualRoot = new DomForestNode(0, 0); maxpreorder.insert(std::make_pair((MachineBasicBlock*)0, ~0UL)); - std::vector worklist; - worklist.reserve(instrs.size()); - for (SmallPtrSet::iterator I = instrs.begin(), - E = instrs.end(); I != E; ++I) + std::vector worklist; + worklist.reserve(regs.size()); + for (std::set::iterator I = regs.begin(), E = regs.end(); + I != E; ++I) worklist.push_back(*I); - PreorderSorter PS(preorder); + + PreorderSorter PS(preorder, LV); std::sort(worklist.begin(), worklist.end(), PS); DomForestNode* CurrentParent = VirtualRoot; std::vector stack; stack.push_back(VirtualRoot); - for (std::vector::iterator I = worklist.begin(), - E = worklist.end(); I != E; ++I) { - while (preorder[(*I)->getParent()] > - maxpreorder[CurrentParent->getInstr()->getParent()]) { + for (std::vector::iterator I = worklist.begin(), E = worklist.end(); + I != E; ++I) { + unsigned pre = preorder[LV.getVarInfo(*I).DefInst->getParent()]; + MachineBasicBlock* parentBlock = + LV.getVarInfo(CurrentParent->getReg()).DefInst->getParent(); + + while (pre > maxpreorder[parentBlock]) { stack.pop_back(); CurrentParent = stack.back(); + + parentBlock = LV.getVarInfo(CurrentParent->getReg()).DefInst->getParent(); } DomForestNode* child = new DomForestNode(*I, CurrentParent); @@ -206,9 +215,22 @@ StrongPHIElimination::computeDomForest(SmallPtrSet& instrs) { return ret; } +void StrongPHIElimination::processPHI(MachineInstr* P) { + +} + bool StrongPHIElimination::runOnMachineFunction(MachineFunction &Fn) { computeDFS(Fn); + for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { + for (MachineBasicBlock::iterator BI = I->begin(), BE = I->end(); BI != BE; + ++BI) { + if (BI->getOpcode() == TargetInstrInfo::PHI) + processPHI(BI); + else + break; + } + } return false; }