Fix a case where debug_value could affect codegen.
authorDale Johannesen <dalej@apple.com>
Sat, 30 Jan 2010 00:57:47 +0000 (00:57 +0000)
committerDale Johannesen <dalej@apple.com>
Sat, 30 Jan 2010 00:57:47 +0000 (00:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94866 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocLocal.cpp

index cbb5826ce9a144a6b0b6f4e584725dc3327d5cf5..6a09bd981665f0172242705421cdbfe2be82a898 100644 (file)
@@ -838,6 +838,18 @@ void RALocal::AllocateBasicBlock(MachineBasicBlock &MBB) {
       }
     }
 
+    // If a DEBUG_VALUE says something is located in a spilled register,
+    // change the DEBUG_VALUE to be undef, which prevents the register
+    // from being reloaded here.  Doing that would change the generated
+    // code, unless another use immediately follows this instruction.
+    if (MI->getOpcode()==TargetInstrInfo::DEBUG_VALUE &&
+        MI->getNumOperands()==3 && MI->getOperand(0).isReg()) {
+      unsigned VirtReg = MI->getOperand(0).getReg();
+      if (VirtReg && TargetRegisterInfo::isVirtualRegister(VirtReg) &&
+          !getVirt2PhysRegMapSlot(VirtReg))
+        MI->getOperand(0).setReg(0U);
+    }
+
     // Get the used operands into registers.  This has the potential to spill
     // incoming values if we are out of registers.  Note that we completely
     // ignore physical register uses here.  We assume that if an explicit