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

Evan Cheng evan.cheng at apple.com
Wed Apr 25 10:45:21 PDT 2012


You deleted my code! :-)

Evan

On Apr 25, 2012, at 9:17 AM, Jakob Stoklund Olesen wrote:

> Author: stoklund
> Date: Wed Apr 25 11:17:47 2012
> New Revision: 155551
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=155551&view=rev
> Log:
> Cross-class joining is winning.
> 
> Remove the heuristic for disabling cross-class joins. The greedy
> register allocator can handle the narrow register classes, and when it
> splits a live range, it can pick a larger register class.
> 
> Benchmarks were unaffected by this change.
> 
> <rdar://problem/11302212>
> 
> 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=155551&r1=155550&r2=155551&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp (original)
> +++ llvm/trunk/lib/CodeGen/RegisterCoalescer.cpp Wed Apr 25 11:17:47 2012
> @@ -149,14 +149,6 @@
>     /// shouldJoinPhys - Return true if a physreg copy should be joined.
>     bool shouldJoinPhys(CoalescerPair &CP);
> 
> -    /// isWinToJoinCrossClass - Return true if it's profitable to coalesce
> -    /// two virtual registers from different register classes.
> -    bool isWinToJoinCrossClass(unsigned SrcReg,
> -                               unsigned DstReg,
> -                               const TargetRegisterClass *SrcRC,
> -                               const TargetRegisterClass *DstRC,
> -                               const TargetRegisterClass *NewRC);
> -
>     /// UpdateRegDefsUses - Replace all defs and uses of SrcReg to DstReg and
>     /// update the subregister number if it is not zero. If DstReg is a
>     /// physical register and the existing subregister number of the def / use
> @@ -1052,56 +1044,6 @@
>   return true;
> }
> 
> -/// isWinToJoinCrossClass - Return true if it's profitable to coalesce
> -/// two virtual registers from different register classes.
> -bool
> -RegisterCoalescer::isWinToJoinCrossClass(unsigned SrcReg,
> -                                             unsigned DstReg,
> -                                             const TargetRegisterClass *SrcRC,
> -                                             const TargetRegisterClass *DstRC,
> -                                             const TargetRegisterClass *NewRC) {
> -  unsigned NewRCCount = RegClassInfo.getNumAllocatableRegs(NewRC);
> -  // This heuristics is good enough in practice, but it's obviously not *right*.
> -  // 4 is a magic number that works well enough for x86, ARM, etc. It filter
> -  // out all but the most restrictive register classes.
> -  if (NewRCCount > 4 ||
> -      // Early exit if the function is fairly small, coalesce aggressively if
> -      // that's the case. For really special register classes with 3 or
> -      // fewer registers, be a bit more careful.
> -      (LIS->getFuncInstructionCount() / NewRCCount) < 8)
> -    return true;
> -  LiveInterval &SrcInt = LIS->getInterval(SrcReg);
> -  LiveInterval &DstInt = LIS->getInterval(DstReg);
> -  unsigned SrcSize = LIS->getApproximateInstructionCount(SrcInt);
> -  unsigned DstSize = LIS->getApproximateInstructionCount(DstInt);
> -
> -  // Coalesce aggressively if the intervals are small compared to the number of
> -  // registers in the new class. The number 4 is fairly arbitrary, chosen to be
> -  // less aggressive than the 8 used for the whole function size.
> -  const unsigned ThresSize = 4 * NewRCCount;
> -  if (SrcSize <= ThresSize && DstSize <= ThresSize)
> -    return true;
> -
> -  // Estimate *register use density*. If it doubles or more, abort.
> -  unsigned SrcUses = std::distance(MRI->use_nodbg_begin(SrcReg),
> -                                   MRI->use_nodbg_end());
> -  unsigned DstUses = std::distance(MRI->use_nodbg_begin(DstReg),
> -                                   MRI->use_nodbg_end());
> -  unsigned NewUses = SrcUses + DstUses;
> -  unsigned NewSize = SrcSize + DstSize;
> -  if (SrcRC != NewRC && SrcSize > ThresSize) {
> -    unsigned SrcRCCount = RegClassInfo.getNumAllocatableRegs(SrcRC);
> -    if (NewUses*SrcSize*SrcRCCount > 2*SrcUses*NewSize*NewRCCount)
> -      return false;
> -  }
> -  if (DstRC != NewRC && DstSize > ThresSize) {
> -    unsigned DstRCCount = RegClassInfo.getNumAllocatableRegs(DstRC);
> -    if (NewUses*DstSize*DstRCCount > 2*DstUses*NewSize*NewRCCount)
> -      return false;
> -  }
> -  return true;
> -}
> -
> 
> /// JoinCopy - Attempt to join intervals corresponding to SrcReg/DstReg,
> /// which are the src/dst of the copy instruction CopyMI.  This returns true
> @@ -1159,14 +1101,6 @@
>         DEBUG(dbgs() << "\tCross-class joins disabled.\n");
>         return false;
>       }
> -      if (!isWinToJoinCrossClass(CP.getSrcReg(), CP.getDstReg(),
> -                                 MRI->getRegClass(CP.getSrcReg()),
> -                                 MRI->getRegClass(CP.getDstReg()),
> -                                 CP.getNewRC())) {
> -        DEBUG(dbgs() << "\tAvoid coalescing to constrained register class.\n");
> -        Again = true;  // May be possible to coalesce later.
> -        return false;
> -      }
>     }
> 
>     // When possible, let DstReg be the larger interval.
> 
> 
> _______________________________________________
> 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