Only mark remainder intervals as RS_Spill after per-block splitting.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 5 Aug 2011 23:50:31 +0000 (23:50 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 5 Aug 2011 23:50:31 +0000 (23:50 +0000)
The local ranges created get to stay in the RS_New stage, just like for
local and region splitting.

This gives tryLocalSplit a bit more freedom the first time it sees one
of these new local ranges.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137001 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocGreedy.cpp

index 291db7b4bfc4accf18323713d7517d19c9945b2f..450f008b67a0dccf383613c689dcd4af8854e256 100644 (file)
@@ -1227,12 +1227,22 @@ unsigned RAGreedy::tryBlockSplit(LiveInterval &VirtReg, AllocationOrder &Order,
     return 0;
 
   // We did split for some blocks.
-  SE->finish();
+  SmallVector<unsigned, 8> IntvMap;
+  SE->finish(&IntvMap);
 
   // Tell LiveDebugVariables about the new ranges.
   DebugVars->splitRegister(Reg, LREdit.regs());
 
-  setStage(NewVRegs.begin(), NewVRegs.end(), RS_Spill);
+  ExtraRegInfo.resize(MRI->getNumVirtRegs());
+
+  // Sort out the new intervals created by splitting. The remainder interval
+  // goes straight to spilling, the new local ranges get to stay RS_New.
+  for (unsigned i = 0, e = LREdit.size(); i != e; ++i) {
+    LiveInterval &LI = *LREdit.get(i);
+    if (getStage(LI) == RS_New && IntvMap[i] == 0)
+      setStage(LI, RS_Spill);
+  }
+
   if (VerifyEnabled)
     MF->verify(this, "After splitting live range around basic blocks");
   return 0;