diff --git a/llvm/lib/CodeGen/StackSlotColoring.cpp b/llvm/lib/CodeGen/StackSlotColoring.cpp --- a/llvm/lib/CodeGen/StackSlotColoring.cpp +++ b/llvm/lib/CodeGen/StackSlotColoring.cpp @@ -72,6 +72,7 @@ // to be careful that renames like [FI0, FI1] -> [FI1, FI2] do not // become FI0 -> FI1 -> FI2. SmallVector, 16> SSRefs; + DenseMap BBDbgRefs; // OrigAlignments - Alignments of stack objects before coloring. SmallVector OrigAlignments; @@ -370,8 +371,14 @@ // Rewrite all MO_FrameIndex operands. Look for dead stores. for (MachineBasicBlock &MBB : MF) { - for (MachineInstr &MI : MBB) + BBDbgRefs.clear(); + for (MachineInstr &MI : MBB) { + if (MI.isDebugValue() && MI.getOperand(0).isFI()) { + auto FI = MI.getOperand(0).getIndex(); + BBDbgRefs[FI] = &MI.getOperand(0); + } RewriteInstruction(MI, SlotMapping, MF); + } RemoveDeadStores(&MBB); } @@ -405,6 +412,20 @@ if (NewFI == -1 || NewFI == OldFI) continue; + // If NewFI (!= OldFI) has active DBG_VALUE we need to kill that variable. + if (MI.isDebugValue() && BBDbgRefs[NewFI]) { + auto MO = BBDbgRefs[NewFI]; + auto DbgValue = MO->getParent(); + BuildMI(*DbgValue->getParent(), MI, DbgValue->getDebugLoc(), + TII->get(TargetOpcode::DBG_VALUE)) + .addReg(0) // $noreg + .add(DbgValue->getOperand(1)) + .add(DbgValue->getOperand(2)) + .add(DbgValue->getOperand(3)); + + BBDbgRefs.erase(NewFI); + } + assert(MFI->getStackID(OldFI) == MFI->getStackID(NewFI)); MO.setIndex(NewFI); }