[llvm-commits] [llvm] r47631 - /llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp

Chris Lattner sabre at nondot.org
Tue Feb 26 14:08:41 PST 2008


Author: lattner
Date: Tue Feb 26 16:08:41 2008
New Revision: 47631

URL: http://llvm.org/viewvc/llvm-project?rev=47631&view=rev
Log:
Use a smallvector for inactiveCounts and initialize it lazily 
instead of init'ing it maximally to zeros on entry.  getFreePhysReg
is pretty hot and only a few elements are typically used.  This speeds
up linscan by 5% on 176.gcc.


Modified:
    llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp

Modified: llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp?rev=47631&r1=47630&r2=47631&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocLinearScan.cpp Tue Feb 26 16:08:41 2008
@@ -839,7 +839,7 @@
 /// getFreePhysReg - return a free physical register for this virtual register
 /// interval if we have one, otherwise return 0.
 unsigned RALinScan::getFreePhysReg(LiveInterval *cur) {
-  std::vector<unsigned> inactiveCounts(tri_->getNumRegs(), 0);
+  SmallVector<unsigned, 256> inactiveCounts;
   unsigned MaxInactiveCount = 0;
   
   const TargetRegisterClass *RC = reginfo_->getRegClass(cur->reg);
@@ -856,6 +856,8 @@
     const TargetRegisterClass *RegRC = reginfo_->getRegClass(reg);
     if (RelatedRegClasses.getLeaderValue(RegRC) == RCLeader) {
       reg = vrm_->getPhys(reg);
+      if (inactiveCounts.size() <= reg)
+        inactiveCounts.resize(reg+1);
       ++inactiveCounts[reg];
       MaxInactiveCount = std::max(MaxInactiveCount, inactiveCounts[reg]);
     }
@@ -882,10 +884,13 @@
   for (; I != E; ++I)
     if (prt_->isRegAvail(*I)) {
       FreeReg = *I;
-      FreeRegInactiveCount = inactiveCounts[FreeReg];
+      if (FreeReg < inactiveCounts.size())
+        FreeRegInactiveCount = inactiveCounts[FreeReg];
+      else
+        FreeRegInactiveCount = 0;
       break;
     }
-  
+
   // If there are no free regs, or if this reg has the max inactive count,
   // return this register.
   if (FreeReg == 0 || FreeRegInactiveCount == MaxInactiveCount) return FreeReg;
@@ -896,7 +901,8 @@
   // reevaluated now.
   for (; I != E; ++I) {
     unsigned Reg = *I;
-    if (prt_->isRegAvail(Reg) && FreeRegInactiveCount < inactiveCounts[Reg]) {
+    if (prt_->isRegAvail(Reg) && Reg < inactiveCounts.size() &&
+        FreeRegInactiveCount < inactiveCounts[Reg]) {
       FreeReg = Reg;
       FreeRegInactiveCount = inactiveCounts[Reg];
       if (FreeRegInactiveCount == MaxInactiveCount)





More information about the llvm-commits mailing list