[llvm-commits] [llvm] r47860 - /llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp

Bill Wendling isanbard at gmail.com
Mon Mar 3 14:11:16 PST 2008


Author: void
Date: Mon Mar  3 16:11:16 2008
New Revision: 47860

URL: http://llvm.org/viewvc/llvm-project?rev=47860&view=rev
Log:
Multiple instructions can be inserted when eliminating frame indexes. We need
the register scavenger to process all of those new instructions instead of just
the last one inserted.


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

Modified: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp?rev=47860&r1=47859&r2=47860&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
+++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Mon Mar  3 16:11:16 2008
@@ -530,27 +530,44 @@
         // Visit the instructions created by eliminateCallFramePseudoInstr().
         I = next(PrevI);
         MI = NULL;
-      } else if (I->getOpcode() == TargetInstrInfo::DECLARE)
+      } else if (I->getOpcode() == TargetInstrInfo::DECLARE) {
         // Ignore it.
-        I++;
-      else {
-        I++;
+        ++I;
+      } else {
+        bool DoIncr = true;
+
         for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
           if (MI->getOperand(i).isFrameIndex()) {
+            // Some instructions (e.g. inline asm instructions) can have
+            // multiple frame indices and/or cause eliminateFrameIndex to insert
+            // more than one instruction. We need the register scavenger to go
+            // through all of these instructions so that it can update its
+            // register information. We keep the iterator at the point before
+            // insertion so that we can revisit them in full.
+            bool AtBeginning = (I == BB->begin());
+            if (!AtBeginning) --I;
+
             // If this instruction has a FrameIndex operand, we need to use that
             // target machine register info object to eliminate it.
             TRI.eliminateFrameIndex(MI, SPAdj, RS);
 
-            // Revisit the instruction in full.  Some instructions (e.g. inline
-            // asm instructions) can have multiple frame indices.
-            --I;
+            // Reset the iterator if we were at the beginning of the BB.
+            if (AtBeginning) {
+              I = BB->begin();
+              DoIncr = false;
+            }
+
             MI = 0;
             break;
           }
+
+        if (DoIncr) ++I;
       }
+
       // Update register states.
       if (RS && MI) RS->forward(MI);
     }
+
     assert(SPAdj == 0 && "Unbalanced call frame setup / destroy pairs?");
   }
 }





More information about the llvm-commits mailing list