<div dir="ltr">Nice patch, thanks!<br><br>-eric</div><br><div class="gmail_quote">On Wed, May 20, 2015 at 7:47 PM Duncan P. N. Exon Smith <<a href="mailto:dexonsmith@apple.com">dexonsmith@apple.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Wed May 20 21:41:23 2015<br>
New Revision: 237876<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D237876-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=J32kYs-1pYU4xB1PPAP7NBwcrk2Q9Ft_1TA5fSHAwS8&s=byyE3T2uilyflOUMuRiDjKqP_pu05W32qbM6q9vc81U&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=237876&view=rev</a><br>
Log:<br>
AsmPrinter: Compute absolute label difference directly<br>
<br>
Create a low-overhead path for `EmitLabelDifference()` that emits a<br>
emits an absolute number when (1) the output is an object stream and (2)<br>
the two symbols are in the same data fragment.<br>
<br>
This drops memory usage on Mach-O from 975 MB down to 919 MB (5.8%).<br>
The only call is when `!doesDwarfUseRelocationsAcrossSections()` --<br>
i.e., on Mach-O -- since otherwise an absolute offset from the start of<br>
the section needs a relocation.  (`EmitLabelDifference()` is cheaper on<br>
ELF anyway, since it creates 1 fewer temp symbol, and it gets called far<br>
less often.  It's not clear to me if this is even a bottleneck there.)<br>
<br>
(I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;<br>
see r236629 for details.)<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
    llvm/trunk/include/llvm/MC/MCStreamer.h<br>
    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>
    llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_MC_MCObjectStreamer.h-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=J32kYs-1pYU4xB1PPAP7NBwcrk2Q9Ft_1TA5fSHAwS8&s=TQaAg33eso0_EJOyifw6c7P7RDEvpkeA1L3eInscCzE&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=237876&r1=237875&r2=237876&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Wed May 20 21:41:23 2015<br>
@@ -136,6 +136,17 @@ public:<br>
   void EmitZeros(uint64_t NumBytes) override;<br>
   void FinishImpl() override;<br>
<br>
+  /// Emit the absolute difference between two symbols if possible.<br>
+  ///<br>
+  /// Emit the absolute difference between \c Hi and \c Lo, as long as we can<br>
+  /// compute it.  Currently, that requires that both symbols are in the same<br>
+  /// data fragment.  Otherwise, do nothing and return \c false.<br>
+  ///<br>
+  /// \pre Offset of \c Hi is greater than the offset \c Lo.<br>
+  /// \return true on success.<br>
+  bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,<br>
+                              unsigned Size) override;<br>
+<br>
   bool mayHaveInstructions() const override {<br>
     return getCurrentSectionData()->hasInstructions();<br>
   }<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCStreamer.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_include_llvm_MC_MCStreamer.h-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=J32kYs-1pYU4xB1PPAP7NBwcrk2Q9Ft_1TA5fSHAwS8&s=_Om1RnYXe_nMe2VSbt5wxYQGqeoJEb_rZuMIydGzHVM&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=237876&r1=237875&r2=237876&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed May 20 21:41:23 2015<br>
@@ -652,6 +652,15 @@ public:<br>
                                      unsigned Isa, unsigned Discriminator,<br>
                                      StringRef FileName);<br>
<br>
+  /// Emit the absolute difference between two symbols if possible.<br>
+  ///<br>
+  /// \pre Offset of \c Hi is greater than the offset \c Lo.<br>
+  /// \return true on success.<br>
+  virtual bool emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo,<br>
+                                      unsigned Size) {<br>
+    return false;<br>
+  }<br>
+<br>
   virtual MCSymbol *getDwarfLineTableSymbol(unsigned CUID);<br>
   virtual void EmitCFISections(bool EH, bool Debug);<br>
   void EmitCFIStartProc(bool IsSimple);<br>
<br>
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_CodeGen_AsmPrinter_AsmPrinter.cpp-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=J32kYs-1pYU4xB1PPAP7NBwcrk2Q9Ft_1TA5fSHAwS8&s=MUmdbrnbu6eOub3i7-4UaxAOxTn-Z1BVW4g0_jeHqBc&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=237876&r1=237875&r2=237876&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Wed May 20 21:41:23 2015<br>
@@ -1591,6 +1591,10 @@ void AsmPrinter::EmitInt32(int Value) co<br>
 /// .set if it avoids relocations.<br>
 void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,<br>
                                      unsigned Size) const {<br>
+  if (!MAI->doesDwarfUseRelocationsAcrossSections())<br>
+    if (OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size))<br>
+      return;<br>
+<br>
   // Get the Hi-Lo expression.<br>
   const MCExpr *Diff =<br>
     MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext),<br>
<br>
Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_lib_MC_MCObjectStreamer.cpp-3Frev-3D237876-26r1-3D237875-26r2-3D237876-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=J32kYs-1pYU4xB1PPAP7NBwcrk2Q9Ft_1TA5fSHAwS8&s=j0U_d7xahg6lNcKuGNf7xAbY4y2mSF3AXdrJDXuwFas&e=" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=237876&r1=237875&r2=237876&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Wed May 20 21:41:23 2015<br>
@@ -53,6 +53,29 @@ void MCObjectStreamer::flushPendingLabel<br>
   }<br>
 }<br>
<br>
+bool MCObjectStreamer::emitAbsoluteSymbolDiff(const MCSymbol *Hi,<br>
+                                              const MCSymbol *Lo,<br>
+                                              unsigned Size) {<br>
+  // Must have symbol data.<br>
+  if (!Assembler->hasSymbolData(*Hi) || !Assembler->hasSymbolData(*Lo))<br>
+    return false;<br>
+  auto &HiD = Assembler->getSymbolData(*Hi);<br>
+  auto &LoD = Assembler->getSymbolData(*Lo);<br>
+<br>
+  // Must both be assigned to the same (valid) fragment.<br>
+  if (!HiD.getFragment() || HiD.getFragment() != LoD.getFragment())<br>
+    return false;<br>
+<br>
+  // Must be a data fragment.<br>
+  if (!isa<MCDataFragment>(HiD.getFragment()))<br>
+    return false;<br>
+<br>
+  assert(HiD.getOffset() >= LoD.getOffset() &&<br>
+         "Expected Hi to be greater than Lo");<br>
+  EmitIntValue(HiD.getOffset() - LoD.getOffset(), Size);<br>
+  return true;<br>
+}<br>
+<br>
 void MCObjectStreamer::reset() {<br>
   if (Assembler)<br>
     Assembler->reset();<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>