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

Jim Grosbach grosbach at apple.com
Tue Oct 20 12:52:35 PDT 2009


Author: grosbach
Date: Tue Oct 20 14:52:35 2009
New Revision: 84657

URL: http://llvm.org/viewvc/llvm-project?rev=84657&view=rev
Log:
Better handle instructions that re-def a scratch register

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=84657&r1=84656&r2=84657&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
+++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Tue Oct 20 14:52:35 2009
@@ -778,6 +778,8 @@
     // directly.
     for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I) {
       MachineInstr *MI = I;
+      bool isDefInsn = false;
+      bool isKillInsn = false;
       for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i)
         if (MI->getOperand(i).isReg()) {
           MachineOperand &MO = MI->getOperand(i);
@@ -802,6 +804,12 @@
             }
             continue;
           }
+          // If this is a def, remember that this insn defines the value.
+          // This lets us properly consider insns which re-use the scratch
+          // register, such as r2 = sub r2, #imm, in the middle of the
+          // scratch range.
+          if (MO.isDef())
+            isDefInsn = true;
 
           // Have we already allocated a scratch register for this virtual?
           if (Reg != CurrentVirtReg) {
@@ -866,19 +874,20 @@
           assert (CurrentScratchReg && "Missing scratch register!");
           MI->getOperand(i).setReg(CurrentScratchReg);
 
-          // If this is the last use of the register, stop tracking it.
           if (MI->getOperand(i).isKill()) {
-            PrevScratchReg = CurrentScratchReg;
-            PrevLastUseMI = MI;
+            isKillInsn = true;
             PrevLastUseOp = i;
-            CurrentScratchReg = CurrentVirtReg = 0;
-            havePrevValue = trackingCurrentValue;
-            // Re-scan the operands of this instruction to catch definitions
-            // of the scratch register we're using. This is to handle things
-            // like ldr "r2, [scratch]" where scratch is r2.
-            i = 0;
+            PrevLastUseMI = MI;
           }
         }
+      // If this is the last use of the scratch, stop tracking it. The
+      // last use will be a kill operand in an instruction that does
+      // not also define the scratch register.
+      if (isKillInsn && !isDefInsn) {
+        PrevScratchReg = CurrentScratchReg;
+        CurrentScratchReg = CurrentVirtReg = 0;
+        havePrevValue = trackingCurrentValue;
+      }
       RS->forward(MI);
     }
   }





More information about the llvm-commits mailing list