Fix an issue where restores could be inserted after a terminator instruction,
authorOwen Anderson <resistor@mac.com>
Thu, 29 Jan 2009 08:22:06 +0000 (08:22 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 29 Jan 2009 08:22:06 +0000 (08:22 +0000)
and an iterator invalidation issue.

FreeBench/pifft no longer miscompiles with these fixes!

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

lib/CodeGen/PreAllocSplitting.cpp

index 44819aabbab7fa45e692ba19fb3a6d2dffe05126..4dc8b82972a026acf6922aaacd4eda11bf6ee3e8 100644 (file)
@@ -277,7 +277,7 @@ PreAllocSplitting::findRestorePoint(MachineBasicBlock *MBB, MachineInstr *MI,
     MII = ++MII;
     // FIXME: Limit the number of instructions to examine to reduce
     // compile time?
-    while (MII != MBB->end()) {
+    while (MII != MBB->getFirstTerminator()) {
       unsigned Index = LIs->getInstructionIndex(MII);
       if (Index > LastIdx)
         break;
@@ -486,7 +486,8 @@ VNInfo* PreAllocSplitting::PerformPHIConstruction(
            IncomingVNs.begin(), E = IncomingVNs.end(); I != E; ++I) {
         I->second->hasPHIKill = true;
         unsigned KillIndex = LIs->getMBBEndIdx(I->first);
-        LI->addKill(I->second, KillIndex);
+        if (!LiveInterval::isKill(I->second, KillIndex))
+          LI->addKill(I->second, KillIndex);
       }
       
       unsigned EndIndex = 0;
@@ -1118,6 +1119,7 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) {
         LIs->RemoveMachineInstrFromMaps(DefMI);
         (*LI)->removeValNo(CurrVN);
         DefMI->eraseFromParent();
+        VNUseCount.erase(CurrVN);
         NumDeadSpills++;
         changed = true;
         continue;
@@ -1176,11 +1178,15 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) {
              VNUseCount[CurrVN].begin(), IE = VNUseCount[CurrVN].end();
              II != IE; ++II) {
           for (DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> >::iterator
-               VI = VNUseCount.begin(), VE = VNUseCount.end(); VI != VE; ++VI)
-            VI->second.erase(*II);
+               VNI = VNUseCount.begin(), VNE = VNUseCount.end(); VNI != VNE; 
+               ++VNI)
+            if (VNI->first != CurrVN)
+              VNI->second.erase(*II);
           LIs->RemoveMachineInstrFromMaps(*II);
           (*II)->eraseFromParent();
         }
+        
+        VNUseCount.erase(CurrVN);
 
         for (DenseMap<VNInfo*, SmallPtrSet<MachineInstr*, 4> >::iterator
              VI = VNUseCount.begin(), VE = VNUseCount.end(); VI != VE; ++VI)
@@ -1204,6 +1210,8 @@ bool PreAllocSplitting::removeDeadSpills(SmallPtrSet<LiveInterval*, 8>& split) {
         (*UI)->eraseFromParent();
       }
         
+      VNUseCount.erase(CurrVN);
+        
       LIs->RemoveMachineInstrFromMaps(DefMI);
       (*LI)->removeValNo(CurrVN);
       DefMI->eraseFromParent();