[llvm-commits] [llvm] r136388 - /llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Thu Jul 28 13:48:23 PDT 2011


Author: stoklund
Date: Thu Jul 28 15:48:23 2011
New Revision: 136388

URL: http://llvm.org/viewvc/llvm-project?rev=136388&view=rev
Log:
Reverse order of RS_Split live ranges under -compact-regions.

There are two conflicting strategies in play:

- Under high register pressure, we want to assign large live ranges
  first. Smaller live ranges are easier to place afterwards.

- Live range splitting is guided by interference, so splitting should be
  deferred until interference is as realistic as possible.

With the recent changes to the live range stages, and with compact
regions enabled, it is less traumatic to split a live range too early.
If some of the split products were too big, they can often be split
again.

By reversing the RS_Split order, we get this queue order:

1. Normal live ranges, large to small.
2. RS_Split live ranges, large to small.

The large-to-small order improves RAGreedy's puzzle solving skills under
high register pressure. It may cause a bit more iterated splitting, but
we handle that better now.

With this change, -compact-regions is mostly an improvement on SPEC.

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

Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=136388&r1=136387&r2=136388&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Thu Jul 28 15:48:23 2011
@@ -398,12 +398,15 @@
   if (ExtraRegInfo[Reg].Stage == RS_New)
     ExtraRegInfo[Reg].Stage = RS_Assign;
 
-  if (ExtraRegInfo[Reg].Stage == RS_Split)
+  if (ExtraRegInfo[Reg].Stage == RS_Split) {
     // Unsplit ranges that couldn't be allocated immediately are deferred until
     // everything else has been allocated. Long ranges are allocated last so
     // they are split against realistic interference.
-    Prio = (1u << 31) - Size;
-  else {
+    if (CompactRegions)
+      Prio = Size;
+    else
+      Prio = (1u << 31) - Size;
+  } else {
     // Everything else is allocated in long->short order. Long ranges that don't
     // fit should be spilled ASAP so they don't create interference.
     Prio = (1u << 31) + Size;





More information about the llvm-commits mailing list