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

Owen Anderson resistor at mac.com
Wed Dec 17 14:17:28 PST 2008


Author: resistor
Date: Wed Dec 17 16:17:27 2008
New Revision: 61159

URL: http://llvm.org/viewvc/llvm-project?rev=61159&view=rev
Log:
Revert r61158 for now, as it caused some test failures.

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=61159&r1=61158&r2=61159&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp (original)
+++ llvm/trunk/lib/CodeGen/PreAllocSplitting.cpp Wed Dec 17 16:17:27 2008
@@ -41,7 +41,6 @@
 STATISTIC(NumSplits, "Number of intervals split");
 STATISTIC(NumRemats, "Number of intervals split by rematerialization");
 STATISTIC(NumFolds, "Number of intervals split with spill folding");
-STATISTIC(NumRenumbers, "Number of intervals renumbered into new registers");
 
 namespace {
   class VISIBILITY_HIDDEN PreAllocSplitting : public MachineFunctionPass {
@@ -138,7 +137,7 @@
 
     void UpdateSpillSlotInterval(VNInfo*, unsigned, unsigned);
 
-    VNInfo* UpdateRegisterInterval(VNInfo*, unsigned, unsigned);
+    void UpdateRegisterInterval(VNInfo*, unsigned, unsigned);
 
     bool ShrinkWrapToLastUse(MachineBasicBlock*, VNInfo*,
                              SmallVector<MachineOperand*, 4>&,
@@ -410,7 +409,7 @@
 /// UpdateRegisterInterval - Given the specified val# of the current live
 /// interval is being split, and the spill and restore indices, update the live
 /// interval accordingly.
-VNInfo*
+void
 PreAllocSplitting::UpdateRegisterInterval(VNInfo *ValNo, unsigned SpillIndex,
                                           unsigned RestoreIndex) {
   assert(LIs->getMBBFromIndex(RestoreIndex) == BarrierMBB &&
@@ -513,8 +512,6 @@
     unsigned End   = After[i].second;
     CurrLI->addRange(LiveRange(Start, End, AValNo));
   }
-  
-  return AValNo;
 }
 
 /// ShrinkWrapToLastUse - There are uses of the current live interval in the
@@ -703,14 +700,17 @@
   ShrinkWrapLiveInterval(ValNo, BarrierMBB, NULL, DefMI->getParent(), Visited,
                          Uses, UseMIs, UseMBBs);
 
+#if 0
+  if (!ValNo->hasPHIKill)
+    RenumberValno();
+#endif
+  // FIXME: If ValNo->hasPHIKill is false, then renumber the val# by
+  // the restore.
+
   // Remove live range from barrier to the restore. FIXME: Find a better
   // point to re-start the live interval.
-  VNInfo* AfterValNo = UpdateRegisterInterval(ValNo,
-                                              LIs->getUseIndex(BarrierIdx)+1,
-                                              LIs->getDefIndex(RestoreIdx));
-  // Attempt to renumber the new valno into a new vreg.
-  if (!AfterValNo->hasPHIKill)
-    RenumberValno(AfterValNo);
+  UpdateRegisterInterval(ValNo, LIs->getUseIndex(BarrierIdx)+1,
+                         LIs->getDefIndex(RestoreIdx));
 }
 
 /// RenumberValno - Split the given valno out into a new vreg, allowing it to
@@ -722,41 +722,15 @@
   // Create the new vreg
   unsigned NewVReg = MRI->createVirtualRegister(MRI->getRegClass(CurrLI->reg));
   
-  // Create the new live interval
+  // Copy over the valno and ranges
   LiveInterval& NewLI = LIs->getOrCreateInterval(NewVReg);
-  SmallVector<VNInfo*, 4> VNsToCopy;
-  VNsToCopy.push_back(VN);
-
-  // Walk through and copy the valno we care about, and any other valnos
-  // that are two-address redefinitions of the one we care about.  These
-  // will need to be rewritten as well.
-  while (!VNsToCopy.empty()) {
-    VNInfo* OldVN = VNsToCopy.back();
-    VNsToCopy.pop_back();
-    
-    // Copy the valno over
-    VNInfo* NewVN = NewLI.getNextValue(OldVN->def, OldVN->copy, 
-                                       LIs->getVNInfoAllocator());
-    NewLI.copyValNumInfo(NewVN, OldVN);
-    NewLI.MergeValueInAsValue(*CurrLI, OldVN, NewVN);
-
-    // Locate two-address redefinitions
-    for (SmallVector<unsigned, 4>::iterator KI = NewVN->kills.begin(),
-         KE = NewVN->kills.end(); KI != KE; ++KI) {
-      MachineInstr* MI = LIs->getInstructionFromIndex(*KI);
-      unsigned DefIdx = MI->findRegisterDefOperandIdx(CurrLI->reg);
-      if (DefIdx == ~0U) continue;
-      if (MI->isRegReDefinedByTwoAddr(DefIdx)) {
-        VNInfo* NextVN =
-                     CurrLI->findDefinedVNInfo(LiveIntervals::getDefIndex(*KI));
-        VNsToCopy.push_back(NextVN);
-      }
-    }
-
-    // Remove the valno from the old interval
-    CurrLI->removeValNo(OldVN);
-  }
+  VNInfo* NewVN = NewLI.getNextValue(VN->def, VN->copy, 
+                                     LIs->getVNInfoAllocator());
+  NewLI.copyValNumInfo(NewVN, VN);
+  NewLI.MergeValueInAsValue(*CurrLI, VN, NewVN);
   
+  // Remove the valno from the old interval
+  CurrLI->removeValNo(VN);
   
   // Rewrite defs and uses.  This is done in two stages to avoid invalidating
   // the reg_iterator.
@@ -779,8 +753,6 @@
     MachineOperand& MO = Inst->getOperand(OpIdx);
     MO.setReg(NewVReg);
   }
-  
-  NumRenumbers++;
 }
 
 bool PreAllocSplitting::Rematerialize(unsigned vreg, VNInfo* ValNo,
@@ -1125,6 +1097,8 @@
   // Make sure blocks are numbered in order.
   MF.RenumberBlocks();
 
+#if 1
+  // FIXME: Go top down.
   MachineBasicBlock *Entry = MF.begin();
   SmallPtrSet<MachineBasicBlock*,16> Visited;
 
@@ -1143,6 +1117,22 @@
       MadeChange |= SplitRegLiveIntervals(BarrierRCs);
     }
   }
+#else
+  for (MachineFunction::reverse_iterator I = MF.rbegin(), E = MF.rend();
+       I != E; ++I) {
+    BarrierMBB = &*I;
+    for (MachineBasicBlock::reverse_iterator II = BarrierMBB->rbegin(),
+           EE = BarrierMBB->rend(); II != EE; ++II) {
+      Barrier = &*II;
+      const TargetRegisterClass **BarrierRCs =
+        Barrier->getDesc().getRegClassBarriers();
+      if (!BarrierRCs)
+        continue;
+      BarrierIdx = LIs->getInstructionIndex(Barrier);
+      MadeChange |= SplitRegLiveIntervals(BarrierRCs);
+    }
+  }
+#endif
 
   return MadeChange;
 }





More information about the llvm-commits mailing list