<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 class="HOEnZb"><div class="h5"><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">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>