[llvm-commits] [llvm] r58314 - /llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp

Evan Cheng evan.cheng at apple.com
Mon Oct 27 22:28:22 PDT 2008


Author: evancheng
Date: Tue Oct 28 00:28:21 2008
New Revision: 58314

URL: http://llvm.org/viewvc/llvm-project?rev=58314&view=rev
Log:
If def is in the same mbb as the barrier, spilt the value after the last use before the barrier.

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

Modified: llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp?rev=58314&r1=58313&r2=58314&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp (original)
+++ llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp Tue Oct 28 00:28:21 2008
@@ -107,7 +107,7 @@
                         unsigned&);
 
     MachineBasicBlock::iterator
-      findSpillPoint(MachineBasicBlock*, MachineInstr*,
+      findSpillPoint(MachineBasicBlock*, MachineInstr*, MachineInstr*,
                      SmallPtrSet<MachineInstr*, 4>&, unsigned&);
 
     MachineBasicBlock::iterator
@@ -166,12 +166,13 @@
 /// none is found.
 MachineBasicBlock::iterator
 PreAllocSplitting::findSpillPoint(MachineBasicBlock *MBB, MachineInstr *MI,
+                                  MachineInstr *DefMI,
                                   SmallPtrSet<MachineInstr*, 4> &RefsInMBB,
                                   unsigned &SpillIndex) {
   MachineBasicBlock::iterator Pt = MBB->begin();
 
   // Go top down if RefsInMBB is empty.
-  if (RefsInMBB.empty()) {
+  if (RefsInMBB.empty() && !DefMI) {
     MachineBasicBlock::iterator MII = MBB->begin();
     MachineBasicBlock::iterator EndPt = MI;
     do {
@@ -186,7 +187,9 @@
     } while (MII != EndPt);
   } else {
     MachineBasicBlock::iterator MII = MI;
-    while (MII != MBB->begin() && !RefsInMBB.count(MII)) {
+    MachineBasicBlock::iterator EndPt = DefMI
+      ? MachineBasicBlock::iterator(DefMI) : MBB->begin();
+    while (MII != EndPt && !RefsInMBB.count(MII)) {
       unsigned Index = LIs->getInstructionIndex(MII);
       if (LIs->hasGapBeforeInstr(Index)) {
         Pt = MII;
@@ -561,7 +564,7 @@
   if (ValNo->def == ~0U) {
     // If it's defined by a phi, we must split just before the barrier.
     MachineBasicBlock::iterator SpillPt = 
-      findSpillPoint(BarrierMBB, Barrier, RefsInMBB, SpillIndex);
+      findSpillPoint(BarrierMBB, Barrier, NULL, RefsInMBB, SpillIndex);
     if (SpillPt == BarrierMBB->begin())
       return false; // No gap to insert spill.
     // Add spill.
@@ -578,10 +581,17 @@
     // If it's already split, just restore the value. There is no need to spill
     // the def again.
     // Check if it's possible to insert a spill after the def MI.
-    MachineBasicBlock::iterator SpillPt =
-      findNextEmptySlot(DefMBB, DefMI, SpillIndex);
-    if (SpillPt == DefMBB->end())
-      return false; // No gap to insert spill.
+    MachineBasicBlock::iterator SpillPt;
+    if (DefMBB == BarrierMBB) {
+      // Add spill after the def and the last use before the barrier.
+      SpillPt = findSpillPoint(BarrierMBB, Barrier, DefMI, RefsInMBB, SpillIndex);
+      if (SpillPt == DefMBB->begin())
+        return false; // No gap to insert spill.
+    } else {
+      SpillPt = findNextEmptySlot(DefMBB, DefMI, SpillIndex);
+      if (SpillPt == DefMBB->end())
+        return false; // No gap to insert spill.
+    }
     SS = MFI->CreateStackObject(RC->getSize(), RC->getAlignment());
 
     // Add spill. The store instruction kills the register if def is before





More information about the llvm-commits mailing list