Index: llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp =================================================================== --- llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp +++ llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp @@ -1297,6 +1297,10 @@ } else if (MI.isMetaInstruction()) return; + auto IgnoreSPAlias = [this, &MI] (Register R) -> bool { + return MI.isCall() && MTracker->SPAliases.count(R); + }; + // Find the regs killed by MI, and find regmasks of preserved regs. // Max out the number of statically allocated elements in `DeadRegs`, as this // prevents fallback to std::set::count() operations. @@ -1307,7 +1311,7 @@ // Determine whether the operand is a register def. if (MO.isReg() && MO.isDef() && MO.getReg() && Register::isPhysicalRegister(MO.getReg()) && - !(MI.isCall() && MTracker->SPAliases.count(MO.getReg()))) { + !IgnoreSPAlias(MO.getReg())) { // Remove ranges of all aliased registers. for (MCRegAliasIterator RAI(MO.getReg(), TRI, true); RAI.isValid(); ++RAI) // FIXME: Can we break out of this loop early if no insertion occurs? @@ -1351,11 +1355,14 @@ // Look for any clobbers performed by a register mask. Only test locations // that are actually being tracked. for (auto L : MTracker->locations()) { - // Stack locations can't be clobbered by regmasks. + // Stack locations can't be clobbered by regmasks if (MTracker->isSpill(L.Idx)) continue; Register Reg = MTracker->LocIdxToLocID[L.Idx]; + if (IgnoreSPAlias(Reg)) + continue; + for (auto *MO : RegMaskPtrs) if (MO->clobbersPhysReg(Reg)) TTracker->clobberMloc(L.Idx, MI.getIterator(), false); Index: llvm/test/DebugInfo/X86/dbg-addr.ll =================================================================== --- llvm/test/DebugInfo/X86/dbg-addr.ll +++ llvm/test/DebugInfo/X86/dbg-addr.ll @@ -1,4 +1,4 @@ -; RUN: llc %s -o %t.s -experimental-debug-variable-locations=false +; RUN: llc %s -o %t.s -experimental-debug-variable-locations=true ; RUN: llvm-mc -triple x86_64--linux %t.s -filetype=obj -o %t.o ; RUN: FileCheck < %t.s %s ; RUN: llvm-dwarfdump %t.o | FileCheck %s --check-prefix=DWARF