[llvm-commits] [llvm] r45799 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Evan Cheng
evan.cheng at apple.com
Wed Jan 9 17:55:37 PST 2008
Geeze. I asked for comments and was ignored. Tanya asks for it and
she gets it right away. :-)
Evan
On Jan 9, 2008, at 5:15 PM, Tanya Lattner wrote:
> 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
>
> _______________________________________________
> 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