diff --git a/llvm/lib/CodeGen/RemoveRedundantDebugValues.cpp b/llvm/lib/CodeGen/RemoveRedundantDebugValues.cpp --- a/llvm/lib/CodeGen/RemoveRedundantDebugValues.cpp +++ b/llvm/lib/CodeGen/RemoveRedundantDebugValues.cpp @@ -12,6 +12,7 @@ #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/CodeGen/Register.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/Function.h" @@ -30,6 +31,8 @@ STATISTIC(NumRemovedBackward, "Number of DBG_VALUEs removed (backward scan)"); STATISTIC(NumRemovedForward, "Number of DBG_VALUEs removed (forward scan)"); +STATISTIC(PeakVariableMapSize, "Maximum size of VariableMap (forward scan)"); +STATISTIC(PeakRegisterSetSize, "Maximum size of RegisterSet (forward scan)"); namespace { @@ -87,6 +90,11 @@ VariableMap; const auto *TRI = MBB.getParent()->getSubtarget().getRegisterInfo(); + // Checking if an MI modifies a register is not trivial, so instead of + // directly checking the register of everything in VariableMap, we collect all + // the registers here and only check this set. If any register is clobbered, + // we can do a trivial register comparison to remove it from VariableMap. + DenseSet RegisterSet; for (auto &MI : MBB) { if (MI.isDebugValue()) { DebugVariable Var(MI.getDebugVariable(), std::nullopt, @@ -116,6 +124,10 @@ VMI->second.first->getReg() != Loc.getReg() || VMI->second.second != MI.getDebugExpression()) { VariableMap[Var] = {&Loc, MI.getDebugExpression()}; + PeakVariableMapSize.updateMax(VariableMap.size()); + + RegisterSet.insert(Loc.getReg()); + PeakRegisterSetSize.updateMax(RegisterSet.size()); continue; } @@ -128,10 +140,15 @@ continue; // Stop tracking any location that is clobbered by this instruction. - for (auto &Var : VariableMap) { - auto &LocOp = Var.second.first; - if (MI.modifiesRegister(LocOp->getReg(), TRI)) - VariableMap.erase(Var.first); + for (const Register reg : RegisterSet) { + if (MI.modifiesRegister(reg, TRI)) { + for (auto &Var : VariableMap) { + const auto &LocOp = Var.second.first; + if (LocOp->getReg() == reg) + VariableMap.erase(Var.first); + } + RegisterSet.erase(reg); + } } }