From 49b6fe0ba50f2fe124684680f690f6ae01c09b80 Mon Sep 17 00:00:00 2001 From: David Stenberg Date: Sun, 8 Sep 2019 14:05:10 +0000 Subject: [PATCH] [NFC] Make the describeLoadedValue() hook return machine operand objects Summary: This changes the ParamLoadedValue pair which the describeLoadedValue() hook returns so that MachineOperand objects are returned instead of pointers. When describing call site values we may need to describe operands which are not part of the instruction. One such example is zero-materializing XORs on x86, which I have implemented support for in a child revision. Instead of having to return a pointer to an operand stored somewhere outside the instruction, start returning objects directly instead, as that simplifies the code. The MachineOperand class only holds POD members, and on x86-64 it is 32 bytes large. That combined with copy elision means that the overhead of returning a machine operand object from the hook does not become very large. I benchmarked this on a 8-thread i7-8650U machine with 32 GB RAM. The benchmark consisted of building a clang 8.0 binary configured with: -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DLLVM_TARGETS_TO_BUILD=X86 \ -DLLVM_USE_SANITIZER=Address \ -DCMAKE_CXX_FLAGS="-Xclang -femit-debug-entry-values -stdlib=libc++" The average wall clock time increased by 4 seconds, from 62:05 to 62:09, which is an 0.1% increase. Reviewers: aprantl, vsk, djtodoro, NikolaPrica Reviewed By: vsk Subscribers: hiraditya, ychen, llvm-commits Tags: #debug-info, #llvm Differential Revision: https://reviews.llvm.org/D67261 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371332 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/TargetInstrInfo.h | 2 +- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 8 ++++---- lib/CodeGen/TargetInstrInfo.cpp | 6 +++--- lib/Target/X86/X86InstrInfo.cpp | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/llvm/CodeGen/TargetInstrInfo.h b/include/llvm/CodeGen/TargetInstrInfo.h index 23a6077f17e..9384bbcca33 100644 --- a/include/llvm/CodeGen/TargetInstrInfo.h +++ b/include/llvm/CodeGen/TargetInstrInfo.h @@ -60,7 +60,7 @@ class TargetSubtargetInfo; template class SmallVectorImpl; -using ParamLoadedValue = std::pair; +using ParamLoadedValue = std::pair; //--------------------------------------------------------------------------- /// diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 371ee3a7e16..5f02fab7a80 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -655,12 +655,12 @@ static void collectCallSiteParameters(const MachineInstr *CallMI, unsigned Reg = Defs[0]; if (auto ParamValue = TII->describeLoadedValue(*I)) { - if (ParamValue->first->isImm()) { - unsigned Val = ParamValue->first->getImm(); + if (ParamValue->first.isImm()) { + unsigned Val = ParamValue->first.getImm(); DbgValueLoc DbgLocVal(ParamValue->second, Val); finishCallSiteParam(DbgLocVal, Reg); - } else if (ParamValue->first->isReg()) { - Register RegLoc = ParamValue->first->getReg(); + } else if (ParamValue->first.isReg()) { + Register RegLoc = ParamValue->first.getReg(); unsigned SP = TLI->getStackPointerRegisterToSaveRestore(); Register FP = TRI->getFrameRegister(*MF); bool IsSPorFP = (RegLoc == SP) || (RegLoc == FP); diff --git a/lib/CodeGen/TargetInstrInfo.cpp b/lib/CodeGen/TargetInstrInfo.cpp index e64c67f6240..0406649345b 100644 --- a/lib/CodeGen/TargetInstrInfo.cpp +++ b/lib/CodeGen/TargetInstrInfo.cpp @@ -1129,10 +1129,10 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI) const { if (isCopyInstr(MI, SrcRegOp, DestRegOp)) { Op = SrcRegOp; - return ParamLoadedValue(Op, Expr); + return ParamLoadedValue(*Op, Expr); } else if (MI.isMoveImmediate()) { Op = &MI.getOperand(1); - return ParamLoadedValue(Op, Expr); + return ParamLoadedValue(*Op, Expr); } else if (MI.hasOneMemOperand()) { int64_t Offset; const auto &TRI = MF->getSubtarget().getRegisterInfo(); @@ -1144,7 +1144,7 @@ TargetInstrInfo::describeLoadedValue(const MachineInstr &MI) const { Expr = DIExpression::prepend(Expr, DIExpression::DerefAfter, Offset); Op = BaseOp; - return ParamLoadedValue(Op, Expr); + return ParamLoadedValue(*Op, Expr); } return None; diff --git a/lib/Target/X86/X86InstrInfo.cpp b/lib/Target/X86/X86InstrInfo.cpp index bf7dcb232b8..7657db76915 100644 --- a/lib/Target/X86/X86InstrInfo.cpp +++ b/lib/Target/X86/X86InstrInfo.cpp @@ -7545,7 +7545,7 @@ X86InstrInfo::describeLoadedValue(const MachineInstr &MI) const { DIExpression::appendOffset(Ops, Offset); Expr = DIExpression::get(MI.getMF()->getFunction().getContext(), Ops); - return ParamLoadedValue(Op, Expr);; + return ParamLoadedValue(*Op, Expr);; } default: return TargetInstrInfo::describeLoadedValue(MI); -- 2.40.0