diff --git a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp --- a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp +++ b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp @@ -1288,6 +1288,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. @@ -1298,7 +1302,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? @@ -1347,6 +1351,9 @@ 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); diff --git a/llvm/test/DebugInfo/X86/dbg-addr.ll b/llvm/test/DebugInfo/X86/dbg-addr.ll --- a/llvm/test/DebugInfo/X86/dbg-addr.ll +++ b/llvm/test/DebugInfo/X86/dbg-addr.ll @@ -1,13 +1,20 @@ +;; Run twice -- once with DBG_VALUEs, once with instruction referencing. ; RUN: llc %s -o %t.s -experimental-debug-variable-locations=false ; 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 +; 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 + ; Unlike dbg.declare, dbg.addr should be lowered to DBG_VALUE instructions. It ; is control-dependent. ; CHECK-LABEL: use_dbg_addr: ; CHECK: #DEBUG_VALUE: use_dbg_addr:o <- [$rsp+0] +; CHECK-NOT: #DEBUG_VALUE: ; DWARF: DW_TAG_variable ; DWARF-NEXT: DW_AT_location (DW_OP_fbreg +0)