]> granicus.if.org Git - llvm/commitdiff
[NFC] Make the describeLoadedValue() hook return machine operand objects
authorDavid Stenberg <david.stenberg@ericsson.com>
Sun, 8 Sep 2019 14:05:10 +0000 (14:05 +0000)
committerDavid Stenberg <david.stenberg@ericsson.com>
Sun, 8 Sep 2019 14:05:10 +0000 (14:05 +0000)
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
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/TargetInstrInfo.cpp
lib/Target/X86/X86InstrInfo.cpp

index 23a6077f17e6d76fb8b1dd37fab8ebbaa1203d2b..9384bbcca33a562f24fe3fe5efced3129c487d9b 100644 (file)
@@ -60,7 +60,7 @@ class TargetSubtargetInfo;
 
 template <class T> class SmallVectorImpl;
 
-using ParamLoadedValue = std::pair<const MachineOperand*, DIExpression*>;
+using ParamLoadedValue = std::pair<MachineOperand, DIExpression*>;
 
 //---------------------------------------------------------------------------
 ///
index 371ee3a7e166447bbabf6d6d48314785abf5d89c..5f02fab7a80f47f715ecb3c223f20281e882162c 100644 (file)
@@ -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);
index e64c67f6240fccb66556490c96e14fffd2e92a08..0406649345b3605e13888587f34488a689476416 100644 (file)
@@ -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;
index bf7dcb232b8b15a888f58ecbea8fdf7ca3f3ac87..7657db7691513faf7c85971182a170e67f6b60f6 100644 (file)
@@ -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);