[llvm-commits] [llvm] r45799 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp

Owen Anderson resistor at mac.com
Wed Jan 9 18:05:23 PST 2008


What can I say, she's scarier than you. :-p

--Owen

On Jan 9, 2008, at 7:55 PM, Evan Cheng wrote:

> 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
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20080109/43755f17/attachment.bin>


More information about the llvm-commits mailing list