[llvm-commits] [llvm] r43684 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Owen Anderson
resistor at mac.com
Sun Nov 4 14:33:27 PST 2007
Author: resistor
Date: Sun Nov 4 16:33:26 2007
New Revision: 43684
URL: http://llvm.org/viewvc/llvm-project?rev=43684&view=rev
Log:
Another step of stronger PHI elimination down.
Modified:
llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp?rev=43684&r1=43683&r2=43684&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
+++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Sun Nov 4 16:33:26 2007
@@ -21,6 +21,7 @@
#define DEBUG_TYPE "strongphielim"
#include "llvm/CodeGen/Passes.h"
+#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
@@ -44,6 +45,8 @@
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addPreserved<LiveVariables>();
+ AU.addPreservedID(PHIEliminationID);
AU.addRequired<MachineDominatorTree>();
MachineFunctionPass::getAnalysisUsage(AU);
}
@@ -54,10 +57,35 @@
}
private:
+ struct DomForestNode {
+ private:
+ std::vector<DomForestNode*> children;
+ MachineInstr* instr;
+
+ void addChild(DomForestNode* DFN) { children.push_back(DFN); }
+
+ public:
+ typedef std::vector<DomForestNode*>::iterator iterator;
+
+ DomForestNode(MachineInstr* MI, DomForestNode* parent) : instr(MI) {
+ if (parent)
+ parent->addChild(this);
+ }
+
+ MachineInstr* getInstr() { return instr; }
+
+ DomForestNode::iterator begin() { return children.begin(); }
+ DomForestNode::iterator end() { return children.end(); }
+ };
+
DenseMap<MachineBasicBlock*, unsigned> preorder;
DenseMap<MachineBasicBlock*, unsigned> maxpreorder;
void computeDFS(MachineFunction& MF);
+
+ std::vector<DomForestNode*>
+ computeDomForest(SmallPtrSet<MachineInstr*, 8>& instrs);
+
};
char StrongPHIElimination::ID = 0;
@@ -110,3 +138,63 @@
}
}
}
+
+class PreorderSorter {
+private:
+ DenseMap<MachineBasicBlock*, unsigned>& preorder;
+
+public:
+ PreorderSorter(DenseMap<MachineBasicBlock*, unsigned>& p) : preorder(p) { }
+
+ bool operator()(MachineInstr* A, MachineInstr* B) {
+ if (A == B)
+ return false;
+
+ if (preorder[A->getParent()] < preorder[B->getParent()])
+ return true;
+ else if (preorder[A->getParent()] > preorder[B->getParent()])
+ 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);
+ }
+};
+
+std::vector<StrongPHIElimination::DomForestNode*>
+StrongPHIElimination::computeDomForest(SmallPtrSet<MachineInstr*, 8>& instrs) {
+ DomForestNode* VirtualRoot = new DomForestNode(0, 0);
+ maxpreorder.insert(std::make_pair((MachineBasicBlock*)0, ~0UL));
+
+ std::vector<MachineInstr*> worklist;
+ worklist.reserve(instrs.size());
+ for (SmallPtrSet<MachineInstr*, 8>::iterator I = instrs.begin(),
+ E = instrs.end(); I != E; ++I)
+ worklist.push_back(*I);
+ PreorderSorter PS(preorder);
+ std::sort(worklist.begin(), worklist.end(), PS);
+
+ DomForestNode* CurrentParent = VirtualRoot;
+ std::vector<DomForestNode*> stack;
+ stack.push_back(VirtualRoot);
+
+ for (std::vector<MachineInstr*>::iterator I = worklist.begin(),
+ E = worklist.end(); I != E; ++I) {
+ while (preorder[(*I)->getParent()] >
+ maxpreorder[CurrentParent->getInstr()->getParent()]) {
+ stack.pop_back();
+ CurrentParent = stack.back();
+ }
+
+ DomForestNode* child = new DomForestNode(*I, CurrentParent);
+ stack.push_back(child);
+ CurrentParent = child;
+ }
+
+ std::vector<DomForestNode*> ret;
+ ret.insert(ret.end(), VirtualRoot->begin(), VirtualRoot->end());
+ return ret;
+}
More information about the llvm-commits
mailing list