[llvm-commits] [llvm] r44877 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Evan Cheng
evan.cheng at apple.com
Wed Dec 12 01:26:24 PST 2007
Hi Owen,
I know it's work in progress. But could you add some comments? I would
like to follow the code. :-)
Thx,
Evan
On Dec 11, 2007, at 12:12 PM, Owen Anderson <resistor at mac.com> wrote:
> Author: resistor
> Date: Tue Dec 11 14:12:11 2007
> New Revision: 44877
>
> URL: http://llvm.org/viewvc/llvm-project?rev=44877&view=rev
> Log:
> More progress on StrongPHIElimination. Now we actually USE the
> DomForest!
>
> 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=44877&r1=44876&r2=44877&view=diff
>
> ===
> ===
> ===
> =====================================================================
> --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Dec 11
> 14:12:11 2007
> @@ -97,6 +97,9 @@
> void processBlock(MachineBasicBlock* MBB);
>
> std::vector<DomForestNode*> computeDomForest(std::set<unsigned>&
> instrs);
> + void processPHIUnion(MachineInstr* Inst,
> + std::set<unsigned>& PHIUnion,
> +
> std::vector<StrongPHIElimination::DomForestNode*>& DF);
> void breakCriticalEdges(MachineFunction &Fn);
>
> };
> @@ -303,6 +306,92 @@
> }
> }
>
> +void StrongPHIElimination::processPHIUnion(MachineInstr* Inst,
> + std::set<unsigned>&
> PHIUnion,
> +
> std::vector<StrongPHIElimination::DomForestNode*>& DF) {
> +
> + std::vector<DomForestNode*> worklist(DF.begin(), DF.end());
> + SmallPtrSet<DomForestNode*, 4> visited;
> +
> + LiveVariables& LV = getAnalysis<LiveVariables>();
> + unsigned DestReg = Inst->getOperand(0).getReg();
> +
> + while (!worklist.empty()) {
> + DomForestNode* DFNode = worklist.back();
> +
> + LiveVariables::VarInfo& Info = LV.getVarInfo(DFNode->getReg());
> + visited.insert(DFNode);
> +
> + bool inserted = false;
> + SmallPtrSet<DomForestNode*, 4> interferences;
> + for (DomForestNode::iterator CI = DFNode->begin(), CE = DFNode-
> >end();
> + CI != CE; ++CI) {
> + DomForestNode* child = *CI;
> + LiveVariables::VarInfo& CInfo = LV.getVarInfo(child->getReg());
> +
> + if (isLiveOut(Info, CInfo.DefInst->getParent())) {
> + interferences.insert(child);
> + } else if (isLiveIn(Info, CInfo.DefInst->getParent()) ||
> + Info.DefInst->getParent() == CInfo.DefInst-
> >getParent()) {
> + // FIXME: Add (p, c) to possible local interferences
> + }
> +
> + if (!visited.count(child)) {
> + worklist.push_back(child);
> + inserted = true;
> + }
> + }
> +
> + if (interferences.size() == 1) {
> + DomForestNode* child = *interferences.begin();
> +
> + unsigned numParentCopies = 0;
> + unsigned numChildCopies = 0;
> + for (int i = Inst->getNumOperands() - 1; i >= 2; i-=2) {
> + unsigned SrcReg = Inst->getOperand(i-1).getReg();
> + if (SrcReg == DFNode->getReg()) numParentCopies++;
> + else if (SrcReg == child->getReg()) numChildCopies++;
> + }
> +
> + if (numParentCopies < numChildCopies) {
> + // Insert copies for child
> + for (int i = Inst->getNumOperands() - 1; i >= 2; i-=2) {
> + if (Inst->getOperand(i-1).getReg() == child->getReg()) {
> + unsigned SrcReg = Inst->getOperand(i-1).getReg();
> + MachineBasicBlock* From = Inst->getOperand(i).getMBB();
> +
> + Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
> + }
> + }
> +
> + // FIXME: Make child's children parent's children
> + } else {
> + // Insert copies for parent
> + for (int i = Inst->getNumOperands() - 1; i >= 2; i-=2) {
> + if (Inst->getOperand(i-1).getReg() == DFNode->getReg()) {
> + unsigned SrcReg = Inst->getOperand(i-1).getReg();
> + MachineBasicBlock* From = Inst->getOperand(i).getMBB();
> +
> + Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
> + }
> + }
> + }
> + } else if (interferences.size() > 1) {
> + // Insert copies for parent
> + for (int i = Inst->getNumOperands() - 1; i >= 2; i-=2) {
> + if (Inst->getOperand(i-1).getReg() == DFNode->getReg()) {
> + unsigned SrcReg = Inst->getOperand(i-1).getReg();
> + MachineBasicBlock* From = Inst->getOperand(i).getMBB();
> +
> + Waiting[From].push_back(std::make_pair(SrcReg, DestReg));
> + }
> + }
> + }
> +
> + if (!inserted) worklist.pop_back();
> + }
> +}
> +
> /// breakCriticalEdges - Break critical edges coming into blocks
> with PHI
> /// nodes, preserving dominator and livevariable info.
> void StrongPHIElimination::breakCriticalEdges(MachineFunction &Fn) {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list