Fix a bug introduced with my previous patch, where it didn't correctly handle
authorChris Lattner <sabre@nondot.org>
Mon, 9 Apr 2007 01:19:33 +0000 (01:19 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 9 Apr 2007 01:19:33 +0000 (01:19 +0000)
instructions which replace themselves when FI's are rewritten (common on ppc).
This fixes CodeGen/PowerPC/2006-10-17-ppc64-alloca.ll

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

lib/CodeGen/PrologEpilogInserter.cpp

index b76fa3f4eb4b2d6d630da9ed1e6097e4804eb81a..b6e909507a4d522036cf62250bb267d839ec3ca7 100644 (file)
@@ -498,20 +498,22 @@ void PEI::replaceFrameIndices(MachineFunction &Fn) {
 
   for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) {
     if (RS) RS->enterBasicBlock(BB);
-    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
-      for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
-        if (I->getOperand(i).isFrameIndex()) {
+    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) {
+      MachineInstr *MI = I++;
+      for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
+        if (MI->getOperand(i).isFrameIndex()) {
           // If this instruction has a FrameIndex operand, we need to use that
           // target machine register info object to eliminate it.
-          MRI.eliminateFrameIndex(I, RS);
+          MRI.eliminateFrameIndex(MI, RS);
 
           // Revisit the instruction in full.  Some instructions (e.g. inline
           // asm instructions) can have multiple frame indices.
-          e = I->getNumOperands();
-          i = -1U;
+          --I;
+          MI = 0;
+          break;
         }
       // Update register states.
-      if (RS) RS->forward(I);
+      if (RS && MI) RS->forward(MI);
     }
   }
 }