diff options
author | Scott Linder <Scott.Linder@amd.com> | 2023-11-08 21:05:40 +0000 |
---|---|---|
committer | Scott Linder <Scott.Linder@amd.com> | 2023-11-08 21:05:40 +0000 |
commit | 28e8baf03efd7ba43a2af4afb3831caa511880ca (patch) | |
tree | c4fd74d02ce4ec39c77bb0749a3be7a0e8d6a5d0 | |
parent | ef6d187115a28c745108f2b26a5d5a62cedf9b3c (diff) | |
parent | f1931b6c3d9a46f582c4c32e4b328001796fac69 (diff) |
[𝘀𝗽𝗿] initial versionupstream/users/slinder1/sprnfcasmprinter-clarify-handlenewdebugvalue-cache-of-trackedregs
Created using spr 1.3.6-beta.1
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp b/llvm/lib/CodeGen/AsmPrinter/DbgEntityHistoryCalculator.cpp index 55a0afcf7a33..8b67580b9ba5 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<unsigned, bool, 4> 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 |