Live intervals for live-in registers should begin at the beginning of a basic block...
authorOwen Anderson <resistor@mac.com>
Mon, 15 Sep 2008 22:00:38 +0000 (22:00 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 15 Sep 2008 22:00:38 +0000 (22:00 +0000)
instruction.  Also, their valno's should have an unknown def.  This has no effect currently, but was
causing issues when StrongPHIElimination was enabled.

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

lib/CodeGen/LiveIntervalAnalysis.cpp

index 41804db13dca32ce2dc18d7bc64712e0586b4748..577400c674b48cfb4d9058b772478c11f27ed02f 100644 (file)
@@ -624,7 +624,11 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
   MachineBasicBlock::iterator mi = MBB->begin();
   unsigned baseIndex = MIIdx;
   unsigned start = baseIndex;
-  unsigned end = start;
+  while (baseIndex / InstrSlots::NUM < i2miMap_.size() && 
+         getInstructionFromIndex(baseIndex) == 0)
+    baseIndex += InstrSlots::NUM;
+  unsigned end = baseIndex;
+  
   while (mi != MBB->end()) {
     if (mi->killsRegister(interval.reg, tri_)) {
       DOUT << " killed";
@@ -659,7 +663,7 @@ exit:
     }
   }
 
-  LiveRange LR(start, end, interval.getNextValue(start, 0, VNInfoAllocator));
+  LiveRange LR(start, end, interval.getNextValue(~0U, 0, VNInfoAllocator));
   interval.addRange(LR);
   interval.addKill(LR.valno, end);
   DOUT << " +" << LR << '\n';
@@ -676,11 +680,6 @@ void LiveIntervals::computeIntervals() {
   // Track the index of the current machine instr.
   unsigned MIIndex = 0;
   
-  // Skip over empty initial indices.
-  while (MIIndex / InstrSlots::NUM < i2miMap_.size() &&
-         getInstructionFromIndex(MIIndex) == 0)
-    MIIndex += InstrSlots::NUM;
-  
   for (MachineFunction::iterator MBBI = mf_->begin(), E = mf_->end();
        MBBI != E; ++MBBI) {
     MachineBasicBlock *MBB = MBBI;
@@ -699,6 +698,11 @@ void LiveIntervals::computeIntervals() {
                                true);
     }
     
+    // Skip over empty initial indices.
+    while (MIIndex / InstrSlots::NUM < i2miMap_.size() &&
+           getInstructionFromIndex(MIIndex) == 0)
+      MIIndex += InstrSlots::NUM;
+    
     for (; MI != miEnd; ++MI) {
       DOUT << MIIndex << "\t" << *MI;