[llvm-commits] [llvm] r45799 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Tanya Lattner
lattner at apple.com
Wed Jan 9 17:15:17 PST 2008
Nice!
On Jan 9, 2008, at 4:47 PM, Owen Anderson wrote:
> Author: resistor
> Date: Wed Jan 9 18:47:01 2008
> New Revision: 45799
>
> URL: http://llvm.org/viewvc/llvm-project?rev=45799&view=rev
> Log:
> Add more comments explaining the basics of how the decision of when
> to rename and when to insert
> copies is made.
>
> 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=45799&r1=45798&r2=45799&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Wed Jan 9
> 18:47:01 2008
> @@ -390,7 +390,10 @@
> return interference;
> }
>
> -/// processBlock - Eliminate PHIs in the given block
> +/// processBlock - Determine how to break up PHIs in the current
> block. Each
> +/// PHI is broken up by some combination of renaming its operands
> and inserting
> +/// copies. This method is responsible for determining which
> operands receive
> +/// which treatment.
> void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
> LiveVariables& LV = getAnalysis<LiveVariables>();
>
> @@ -398,21 +401,37 @@
> // before the current one.
> std::set<unsigned> ProcessedNames;
>
> + // Iterate over all the PHI nodes in this block
> MachineBasicBlock::iterator P = MBB->begin();
> while (P != MBB->end() && 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.
> + // PHIUnion is the set of incoming registers to the PHI node that
> + // are going to be renames rather than having copies
> inserted. This set
> + // is refinded over the course of this function.
> UnionedBlocks is the set
> + // of corresponding MBBs.
> std::set<unsigned> PHIUnion;
> std::set<MachineBasicBlock*> UnionedBlocks;
>
> + // Iterate over the operands of the PHI node
> for (int i = P->getNumOperands() - 1; i >= 2; i-=2) {
> unsigned SrcReg = P->getOperand(i-1).getReg();
> LiveVariables::VarInfo& SrcInfo = LV.getVarInfo(SrcReg);
>
> - // Check for trivial interferences
> + // Check for trivial interferences via liveness information,
> allowing us
> + // to avoid extra work later. Any registers that interfere
> cannot both
> + // be in the renaming set, so choose one and add copies for
> it instead.
> + // The conditions are:
> + // 1) if the operand is live into the PHI node's block OR
> + // 2) if the PHI node is live out of the operand's
> defining block OR
> + // 3) if the operand is itself a PHI node and the original
> PHI is
> + // live into the operand's defining block OR
> + // 4) if the operand is already being renamed for another
> PHI node
> + // in this block OR
> + // 5) if any two operands are defined in the same block,
> insert copies
> + // for one of them
> if (isLiveIn(SrcInfo, P->getParent()) ||
> isLiveOut(PHIInfo, SrcInfo.DefInst->getParent()) ||
> ( PHIInfo.DefInst->getOpcode() == TargetInstrInfo::PHI &&
> @@ -420,24 +439,32 @@
> ProcessedNames.count(SrcReg) ||
> UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
>
> - // add a copy from a_i to p in Waiting[From[a_i]]
> + // Add a copy for the selected register
> MachineBasicBlock* From = P->getOperand(i).getMBB();
> Waiting[From].insert(std::make_pair(SrcReg, DestReg));
> UsedByAnother.insert(SrcReg);
> } else {
> + // Otherwise, add it to the renaming set
> PHIUnion.insert(SrcReg);
> UnionedBlocks.insert(SrcInfo.DefInst->getParent());
> }
> }
>
> + // Compute the dominator forest for the renaming set. This is
> a forest
> + // where the nodes are the registers and the edges represent
> dominance
> + // relations between the defining blocks of the registers
> std::vector<StrongPHIElimination::DomForestNode*> DF =
>
> computeDomForest(PHIUnion);
>
> - // Walk DomForest to resolve interferences
> + // Walk DomForest to resolve interferences at an inter-block
> level. This
> + // will remove registers from the renaming set (and insert
> copies for them)
> + // if interferences are found.
> std::vector<std::pair<unsigned, unsigned> > localInterferences;
> processPHIUnion(P, PHIUnion, DF, localInterferences);
>
> - // Check for local interferences
> + // The dominator forest walk may have returned some register
> pairs whose
> + // interference cannot be determines from dominator analysis.
> We now
> + // examine these pairs for local interferences.
> for (std::vector<std::pair<unsigned, unsigned> >::iterator I =
> localInterferences.begin(), E = localInterferences.end();
> I != E; ++I) {
> std::pair<unsigned, unsigned> p = *I;
> @@ -481,10 +508,13 @@
> }
> }
>
> - // Cache renaming information
> + // Add the renaming set for this PHI node to our overal
> renaming information
> RenameSets.insert(std::make_pair(P->getOperand(0).getReg(),
> PHIUnion));
>
> + // Remember which registers are already renamed, so that we
> don't try to
> + // rename them for another PHI node in this block
> ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
> +
> ++P;
> }
> }
>
>
> _______________________________________________
> 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