<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 20, 2015 at 11:14 PM, Mehdi Amini <span dir="ltr"><<a href="mailto:mehdi.amini@apple.com" target="_blank">mehdi.amini@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">Hi,<div><br></div><div>Reverted in r250882 in the meantime, assuming the original patch was committed unintentionally.</div><div><br></div><div>I’m not sure if you meant to commit the LoopVersioning.h file only (likely) or if the include in llvm-bcanalyzer was intended as well. Feel free to recommit the appropriate part.</div></div></blockquote><div><br></div><div>Oops, sorry, bad mail filters ate this thread :( Thanks for the revert.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>— </div><span class="HOEnZb"><font color="#888888"><div>Mehdi</div></font></span><div><div class="h5"><div><br><div><blockquote type="cite"><div>On Oct 16, 2015, at 2:02 PM, David Blaikie via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:</div><br><div><div dir="ltr">Ping</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 13, 2015 at 6:06 PM, Sean Silva via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span style="font-size:13px">Are all the llvm-bcanalyzer.cpp changes intentional?</span><br><div><span style="font-size:13px"><br></span></div><div><span style="font-size:13px">-- Sean Silva</span></div></div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 13, 2015 at 3:24 PM, Richard Smith via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Tue Oct 13 17:24:10 2015<br>
New Revision: 250239<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=250239&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=250239&view=rev</a><br>
Log:<br>
Add missing #include, found by modules build.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h<br>
    llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h?rev=250239&r1=250238&r2=250239&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h?rev=250239&r1=250238&r2=250239&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h (original)<br>
+++ llvm/trunk/include/llvm/Transforms/Utils/LoopVersioning.h Tue Oct 13 17:24:10 2015<br>
@@ -16,6 +16,7 @@<br>
 #ifndef LLVM_TRANSFORMS_UTILS_LOOPVERSIONING_H<br>
 #define LLVM_TRANSFORMS_UTILS_LOOPVERSIONING_H<br>
<br>
+#include "llvm/Analysis/LoopAccessAnalysis.h"<br>
 #include "llvm/Transforms/Utils/ValueMapper.h"<br>
 #include "llvm/Transforms/Utils/LoopUtils.h"<br>
<br>
<br>
Modified: llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp?rev=250239&r1=250238&r2=250239&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp?rev=250239&r1=250238&r2=250239&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp (original)<br>
+++ llvm/trunk/tools/llvm-bcanalyzer/llvm-bcanalyzer.cpp Tue Oct 13 17:24:10 2015<br>
@@ -35,6 +35,7 @@<br>
 #include "llvm/Support/CommandLine.h"<br>
 #include "llvm/Support/Format.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
+#include "llvm/Support/MathExtras.h"<br>
 #include "llvm/Support/MemoryBuffer.h"<br>
 #include "llvm/Support/PrettyStackTrace.h"<br>
 #include "llvm/Support/Signals.h"<br>
@@ -335,11 +336,20 @@ static const char *GetCodeName(unsigned<br>
 }<br>
<br>
 struct PerRecordStats {<br>
+  /// The number of times this record code has been seen.<br>
   unsigned NumInstances;<br>
+  /// The number of times this record code has been seen abbreviated.<br>
   unsigned NumAbbrev;<br>
+  /// The total number of bits used for this record on disk.<br>
   uint64_t TotalBits;<br>
-<br>
-  PerRecordStats() : NumInstances(0), NumAbbrev(0), TotalBits(0) {}<br>
+  /// The number of bits that would have been used if no abbrevs were used.<br>
+  uint64_t UnabbrevBits;<br>
+  /// The number of bits that would be used if "good" abbreviations were used.<br>
+  uint64_t GoodAbbrevBits;<br>
+<br>
+  PerRecordStats()<br>
+      : NumInstances(0), NumAbbrev(0), TotalBits(0), UnabbrevBits(0),<br>
+        GoodAbbrevBits(0) {}<br>
 };<br>
<br>
 struct PerBlockIDStats {<br>
@@ -378,6 +388,58 @@ static bool Error(const Twine &Err) {<br>
   return true;<br>
 }<br>
<br>
+static unsigned computeVBR6Bits(uint64_t Val) {<br>
+  unsigned Bits = 0;<br>
+  do {<br>
+    Bits += 6;<br>
+  } while (Val >>= 5);<br>
+  return Bits;<br>
+}<br>
+<br>
+static void addBlobSize(uint64_t &Bits, StringRef Blob) {<br>
+  // Blob size is always VBR6.<br>
+  Bits += computeVBR6Bits(Blob.size());<br>
+<br>
+  // Blob is always 32-bit aligned, and padded to a multiple of 32 bits.<br>
+  RoundUpToAlignment(Bits, 32);<br>
+  Bits += Blob.size() * 8;<br>
+  RoundUpToAlignment(Bits, 32);<br>
+}<br>
+<br>
+/// \brief Compute the number of bits that would be used by the record if it<br>
+/// were unabbreviated.<br>
+static uint64_t computeUnabbrevBits(unsigned AbbrevIDWidth, unsigned Code,<br>
+                                    ArrayRef<uint64_t> Record, StringRef Blob) {<br>
+  uint64_t Bits =<br>
+      AbbrevIDWidth + computeVBR6Bits(Code) + computeVBR6Bits(Record.size());<br>
+  // Use VBR6 for all fields.<br>
+  for (uint64_t Val : Record)<br>
+    Bits += computeVBR6Bits(Val);<br>
+  // Assume Blob representation for the blob, even though a Blob cannot<br>
+  // be unabbreviated.<br>
+  if (!Blob.empty())<br>
+    addBlobSize(Bits, Blob);<br>
+  return Bits;<br>
+}<br>
+<br>
+/// \brief Compute the number of bits that would be used by the record if a<br>
+/// "good" abbreviation were used. We use an extremely simple heuristic for<br>
+/// "good"ness: pick the best abbrev that uses a Literal for the record code,<br>
+/// a normal Blob field for the blob (if present), and a minimal-width Fixed<br>
+/// field for everything else.<br>
+static uint64_t computeGoodAbbrevBits(unsigned AbbrevIDWidth, unsigned Code,<br>
+                                      ArrayRef<uint64_t> Record,<br>
+                                      StringRef Blob) {<br>
+  uint64_t Bits = AbbrevIDWidth;<br>
+  // Use Fixed for all fields (other than the record code).<br>
+  for (uint64_t Val : Record)<br>
+    Bits += 64 - llvm::countLeadingZeros(Val);<br>
+  // Assume Blob representation for the blob.<br>
+  if (!Blob.empty())<br>
+    addBlobSize(Bits, Blob);<br>
+  return Bits;<br>
+}<br>
+<br>
 /// ParseBlock - Read a block, updating statistics, etc.<br>
 static bool ParseBlock(BitstreamCursor &Stream, unsigned BlockID,<br>
                        unsigned IndentLevel, CurStreamTypeType CurStreamType) {<br>
@@ -482,6 +544,10 @@ static bool ParseBlock(BitstreamCursor &<br>
     BlockStats.CodeFreq[Code].NumInstances++;<br>
     BlockStats.CodeFreq[Code].TotalBits +=<br>
       Stream.GetCurrentBitNo()-RecordStartBit;<br>
+    BlockStats.CodeFreq[Code].UnabbrevBits +=<br>
+      computeUnabbrevBits(Stream.getAbbrevIDWidth(), Code, Record, Blob);<br>
+    BlockStats.CodeFreq[Code].GoodAbbrevBits +=<br>
+      computeGoodAbbrevBits(Stream.getAbbrevIDWidth(), Code, Record, Blob);<br>
     if (Entry.ID != bitc::UNABBREV_RECORD) {<br>
       BlockStats.CodeFreq[Code].NumAbbrev++;<br>
       ++BlockStats.NumAbbreviatedRecords;<br>
@@ -720,28 +786,36 @@ static int AnalyzeBitcode() {<br>
<br>
     // Print a histogram of the codes we see.<br>
     if (!NoHistogram && !Stats.CodeFreq.empty()) {<br>
-      std::vector<std::pair<unsigned, unsigned> > FreqPairs;  // <freq,code><br>
+      std::vector<std::pair<uint64_t, unsigned> > FreqPairs;  // <bits,code><br>
       for (unsigned i = 0, e = Stats.CodeFreq.size(); i != e; ++i)<br>
-        if (unsigned Freq = Stats.CodeFreq[i].NumInstances)<br>
+        if (unsigned Freq = Stats.CodeFreq[i].TotalBits)<br>
           FreqPairs.push_back(std::make_pair(Freq, i));<br>
       std::stable_sort(FreqPairs.begin(), FreqPairs.end());<br>
       std::reverse(FreqPairs.begin(), FreqPairs.end());<br>
<br>
       outs() << "\tRecord Histogram:\n";<br>
-      outs() << "\t\t  Count    # Bits   %% Abv  Record Kind\n";<br>
+      outs() << "\t\t  Count    # Bits   % Abv  % Cmp (cur/best)  Record Kind\n";<br>
       for (unsigned i = 0, e = FreqPairs.size(); i != e; ++i) {<br>
         const PerRecordStats &RecStats = Stats.CodeFreq[FreqPairs[i].second];<br>
<br>
-        outs() << format("\t\t%7d %9lu",<br>
+        outs() << format("\t\t%7d %9lu ",<br>
                          RecStats.NumInstances,<br>
                          (unsigned long)RecStats.TotalBits);<br>
<br>
         if (RecStats.NumAbbrev)<br>
           outs() <<<br>
-              format("%7.2f  ",<br>
+              format("%7.2f ",<br>
                      (double)RecStats.NumAbbrev/RecStats.NumInstances*100);<br>
         else<br>
-          outs() << "         ";<br>
+          outs() << "        ";<br>
+<br>
+        if (RecStats.UnabbrevBits)<br>
+          outs() << format(<br>
+              "%7.2f / %7.2f  ",<br>
+              (double)RecStats.TotalBits / RecStats.UnabbrevBits * 100,<br>
+              (double)RecStats.GoodAbbrevBits / RecStats.UnabbrevBits * 100);<br>
+        else<br>
+          outs() << "                   ";<br>
<br>
         if (const char *CodeName =<br>
               GetCodeName(FreqPairs[i].second, I->first, StreamFile,<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>
_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div></div>