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