[llvm-commits] [llvm] r149144 - /llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp

Lang Hames lhames at apple.com
Fri Jan 27 13:47:41 PST 2012


Yeah - not sure how I missed that. Thanks for catching it.

Backed out in r149146 . Will look for a neater way to refactor this.

- Lang.

On Jan 27, 2012, at 1:33 PM, Benjamin Kramer wrote:

> 
> On 27.01.2012, at 20:58, Lang Hames wrote:
> 
>> Author: lhames
>> Date: Fri Jan 27 13:58:14 2012
>> New Revision: 149144
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=149144&view=rev
>> Log:
>> Move some duplicate loops in the coalescer into their own function.
>> 
>> Modified:
>>   llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp
>> 
>> Modified: llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp?rev=149144&r1=149143&r2=149144&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp Fri Jan 27 13:58:14 2012
>> @@ -1421,6 +1421,42 @@
>>  return true;
>> }
>> 
>> +// Loop over the value numbers of the Dst interval and record the values that
>> +// are defined by a copy from the Src interval.
>> +static void FindValuesCopiedFrom(
>> +                              LiveIntervals& lis,
>> +                              const TargetRegisterInfo& tri,
>> +                              CoalescerPair& CP, 
>> +                              LiveInterval &Dst, LiveInterval &Src,
>> +                              DenseMap<VNInfo*, VNInfo*>& DstValsDefinedFromSrc,
>> +                              SmallVector<MachineInstr*, 8>& DupCopies) {
>> +
>> +  for (LiveInterval::vni_iterator i = Dst.vni_begin(), e = Dst.vni_end();
>> +       i != e; ++i) {
>> +    VNInfo *VNI = *i;
>> +    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
>> +      continue;
>> +
>> +    // Never join with a register that has EarlyClobber redefs.
>> +    if (VNI->hasRedefByEC())
>> +      return false;
> 
> GCC complains (correctly) about returning a value from a void function.
> 
> Also you copied this early exit from the other function, effectively changing behavior
> because the caller doesn't return anymore when this condition is met.
> 
> - Ben
> 
>> +
>> +    // Figure out the value # from the Src.
>> +    LiveRange *lr = Src.getLiveRangeContaining(VNI->def.getPrevSlot());
>> +    // The copy could be to an aliased physreg.
>> +    if (!lr) continue;
>> +
>> +    // DstReg is known to be a register in the Dst interval.  If the src is
>> +    // from the Src interval, we can use its value #.
>> +    MachineInstr *MI = VNI->getCopy();
>> +    if (!CP.isCoalescable(MI) &&
>> +        !RegistersDefinedFromSameValue(lis, tri, CP, VNI, lr, DupCopies))
>> +      continue;
>> +
>> +    DstValsDefinedFromSrc[VNI] = lr->valno;
>> +  }
>> +}                            
>> +
>> /// JoinIntervals - Attempt to join these two intervals.  On failure, this
>> /// returns false.
>> bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
>> @@ -1506,59 +1542,9 @@
>>  LiveInterval &LHS = LIS->getOrCreateInterval(CP.getDstReg());
>>  DEBUG({ dbgs() << "\t\tLHS = "; LHS.print(dbgs(), TRI); dbgs() << "\n"; });
>> 
>> -  // Loop over the value numbers of the LHS, seeing if any are defined from
>> -  // the RHS.
>> -  for (LiveInterval::vni_iterator i = LHS.vni_begin(), e = LHS.vni_end();
>> -       i != e; ++i) {
>> -    VNInfo *VNI = *i;
>> -    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
>> -      continue;
>> -
>> -    // Never join with a register that has EarlyClobber redefs.
>> -    if (VNI->hasRedefByEC())
>> -      return false;
>> -
>> -    // Figure out the value # from the RHS.
>> -    LiveRange *lr = RHS.getLiveRangeContaining(VNI->def.getPrevSlot());
>> -    // The copy could be to an aliased physreg.
>> -    if (!lr) continue;
>> -
>> -    // DstReg is known to be a register in the LHS interval.  If the src is
>> -    // from the RHS interval, we can use its value #.
>> -    MachineInstr *MI = VNI->getCopy();
>> -    if (!CP.isCoalescable(MI) &&
>> -        !RegistersDefinedFromSameValue(*LIS, *TRI, CP, VNI, lr, DupCopies))
>> -      continue;
>> -
>> -    LHSValsDefinedFromRHS[VNI] = lr->valno;
>> -  }
>> -
>> -  // Loop over the value numbers of the RHS, seeing if any are defined from
>> -  // the LHS.
>> -  for (LiveInterval::vni_iterator i = RHS.vni_begin(), e = RHS.vni_end();
>> -       i != e; ++i) {
>> -    VNInfo *VNI = *i;
>> -    if (VNI->isUnused() || !VNI->isDefByCopy())  // Src not defined by a copy?
>> -      continue;
>> -
>> -    // Never join with a register that has EarlyClobber redefs.
>> -    if (VNI->hasRedefByEC())
>> -      return false;
>> -
>> -    // Figure out the value # from the LHS.
>> -    LiveRange *lr = LHS.getLiveRangeContaining(VNI->def.getPrevSlot());
>> -    // The copy could be to an aliased physreg.
>> -    if (!lr) continue;
>> -
>> -    // DstReg is known to be a register in the RHS interval.  If the src is
>> -    // from the LHS interval, we can use its value #.
>> -    MachineInstr *MI = VNI->getCopy();
>> -    if (!CP.isCoalescable(MI) &&
>> -        !RegistersDefinedFromSameValue(*LIS, *TRI, CP, VNI, lr, DupCopies))
>> -        continue;
>> -
>> -    RHSValsDefinedFromLHS[VNI] = lr->valno;
>> -  }
>> +  // Build a map of LHS values defined by copies from RHS and vice-versa.
>> +  FindValuesCopiedFrom(*LIS, *TRI, CP, LHS, RHS, LHSValsDefinedFromRHS, DupCopies);
>> +  FindValuesCopiedFrom(*LIS, *TRI, CP, RHS, LHS, RHSValsDefinedFromLHS, DupCopies);
>> 
>>  LHSValNoAssignments.resize(LHS.getNumValNums(), -1);
>>  RHSValNoAssignments.resize(RHS.getNumValNums(), -1);
>> 
>> 
>> _______________________________________________
>> 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