diff --git a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp index 55a0afcf7a33f..8b67580b9ba50 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp @@ -373,6 +373,18 @@ static void handleNewDebugValue(InlinedEntity Var, const MachineInstr &DV, DbgValueHistoryMap &HistMap) { EntryIndex NewIndex; if (HistMap.startDbgValue(Var, DV, NewIndex)) { + // As we already need to iterate all LiveEntries when handling a DbgValue, + // we use this map to avoid a more expensive check against RegVars. There + // is an assert that we handle this correclty in addRegDescribedVar. + // + // In other terms, the presense in this map indicates the presense of a + // corresponding entry in RegVars. + // + // The bool value then tracks whether an entry is to be retained (true) or + // removed (false); as we end previous entries we speculatively assume they + // can be dropped from RegVars, but we then also visit the new entry whose + // set of debug register operands may overlap and "save" a reg from being + // dropped. SmallDenseMap TrackedRegs; // If we have created a new debug value entry, close all preceding @@ -466,9 +478,6 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, for (const auto &MI : MBB) { if (MI.isDebugValue()) { assert(MI.getNumOperands() > 1 && "Invalid DBG_VALUE instruction!"); - // Use the base variable (without any DW_OP_piece expressions) - // as index into History. The full variables including the - // piece expressions are attached to the MI. const DILocalVariable *RawVar = MI.getDebugVariable(); assert(RawVar->isValidLocationForIntrinsic(MI.getDebugLoc()) && "Expected inlined-at fields to agree"); @@ -492,8 +501,7 @@ void llvm::calculateDbgEntityHistory(const MachineFunction *MF, if (MI.isMetaInstruction()) continue; - // Not a DBG_VALUE instruction. It may clobber registers which describe - // some variables. + // Other instruction may clobber registers which describe some variables. for (const MachineOperand &MO : MI.operands()) { if (MO.isReg() && MO.isDef() && MO.getReg()) { // Ignore call instructions that claim to clobber SP. The AArch64