[llvm] r250427 - Sample Profiles - Adjust integer types. Mostly NFC.
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 15 15:36:39 PDT 2015
On Thu, Oct 15, 2015 at 9:36 AM, Diego Novillo via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: dnovillo
> Date: Thu Oct 15 11:36:21 2015
> New Revision: 250427
>
> URL: http://llvm.org/viewvc/llvm-project?rev=250427&view=rev
> Log:
> Sample Profiles - Adjust integer types. Mostly NFC.
>
> This adjusts all integers in the reader/writer to reflect the types
> stored on profile files. They should all be unsigned 32-bit or 64-bit
> values. Changed all associated internal types to be uint32_t or
> uint64_t.
>
> The only place that needed some adjustments is in the sample profile
> transformation. Altough the weight read from the profile are 64-bit
> values, the internal API for branch weights only accepts 32-bit values.
> The pass now saturates weights that overflow uint32_t.
>
> Modified:
> llvm/trunk/include/llvm/ProfileData/SampleProf.h
> llvm/trunk/include/llvm/ProfileData/SampleProfReader.h
> llvm/trunk/include/llvm/ProfileData/SampleProfWriter.h
> llvm/trunk/lib/ProfileData/SampleProfReader.cpp
> llvm/trunk/lib/ProfileData/SampleProfWriter.cpp
> llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp
>
> Modified: llvm/trunk/include/llvm/ProfileData/SampleProf.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/SampleProf.h?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/SampleProf.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/SampleProf.h Thu Oct 15 11:36:21
> 2015
> @@ -73,9 +73,9 @@ static inline uint64_t SPVersion() { ret
> /// that are on the same line but belong to different basic blocks
> /// (e.g., the two post-increment instructions in "if (p) x++; else
> y++;").
> struct LineLocation {
> - LineLocation(int L, unsigned D) : LineOffset(L), Discriminator(D) {}
> - int LineOffset;
> - unsigned Discriminator;
> + LineLocation(uint32_t L, uint32_t D) : LineOffset(L), Discriminator(D)
> {}
> + uint32_t LineOffset;
>
There are a bunch of asserts in this file checking that LineOffset is >=
0. This is now vacuously true. Should the asserts be removed?
> + uint32_t Discriminator;
> };
>
> /// Represents the relative location of a callsite.
> @@ -85,7 +85,7 @@ struct LineLocation {
> /// head is), the discriminator value within that line, and the callee
> /// function name.
> struct CallsiteLocation : public LineLocation {
> - CallsiteLocation(int L, unsigned D, StringRef N)
> + CallsiteLocation(uint32_t L, uint32_t D, StringRef N)
> : LineLocation(L, D), CalleeName(N) {}
> StringRef CalleeName;
> };
> @@ -93,8 +93,8 @@ struct CallsiteLocation : public LineLoc
> } // End namespace sampleprof
>
> template <> struct DenseMapInfo<sampleprof::LineLocation> {
> - typedef DenseMapInfo<int> OffsetInfo;
> - typedef DenseMapInfo<unsigned> DiscriminatorInfo;
> + typedef DenseMapInfo<uint32_t> OffsetInfo;
> + typedef DenseMapInfo<uint32_t> DiscriminatorInfo;
> static inline sampleprof::LineLocation getEmptyKey() {
> return sampleprof::LineLocation(OffsetInfo::getEmptyKey(),
> DiscriminatorInfo::getEmptyKey());
> @@ -104,8 +104,8 @@ template <> struct DenseMapInfo<samplepr
> DiscriminatorInfo::getTombstoneKey());
> }
> static inline unsigned getHashValue(sampleprof::LineLocation Val) {
> - return DenseMapInfo<std::pair<int, unsigned>>::getHashValue(
> - std::pair<int, unsigned>(Val.LineOffset, Val.Discriminator));
> + return DenseMapInfo<std::pair<uint32_t, uint32_t>>::getHashValue(
> + std::pair<uint32_t, uint32_t>(Val.LineOffset, Val.Discriminator));
> }
> static inline bool isEqual(sampleprof::LineLocation LHS,
> sampleprof::LineLocation RHS) {
> @@ -115,8 +115,8 @@ template <> struct DenseMapInfo<samplepr
> };
>
> template <> struct DenseMapInfo<sampleprof::CallsiteLocation> {
> - typedef DenseMapInfo<int> OffsetInfo;
> - typedef DenseMapInfo<unsigned> DiscriminatorInfo;
> + typedef DenseMapInfo<uint32_t> OffsetInfo;
> + typedef DenseMapInfo<uint32_t> DiscriminatorInfo;
> typedef DenseMapInfo<StringRef> CalleeNameInfo;
> static inline sampleprof::CallsiteLocation getEmptyKey() {
> return sampleprof::CallsiteLocation(OffsetInfo::getEmptyKey(),
> @@ -128,8 +128,8 @@ template <> struct DenseMapInfo<samplepr
> "");
> }
> static inline unsigned getHashValue(sampleprof::CallsiteLocation Val) {
> - return DenseMapInfo<std::pair<int, unsigned>>::getHashValue(
> - std::pair<int, unsigned>(Val.LineOffset, Val.Discriminator));
> + return DenseMapInfo<std::pair<uint32_t, uint32_t>>::getHashValue(
> + std::pair<uint32_t, uint32_t>(Val.LineOffset, Val.Discriminator));
> }
> static inline bool isEqual(sampleprof::CallsiteLocation LHS,
> sampleprof::CallsiteLocation RHS) {
> @@ -153,7 +153,7 @@ namespace sampleprof {
> /// will be a list of one or more functions.
> class SampleRecord {
> public:
> - typedef StringMap<unsigned> CallTargetMap;
> + typedef StringMap<uint64_t> CallTargetMap;
>
> SampleRecord() : NumSamples(0), CallTargets() {}
>
> @@ -161,29 +161,29 @@ public:
> ///
> /// Sample counts accumulate using saturating arithmetic, to avoid
> wrapping
> /// around unsigned integers.
> - void addSamples(unsigned S) {
> - if (NumSamples <= std::numeric_limits<unsigned>::max() - S)
> + void addSamples(uint64_t S) {
> + if (NumSamples <= std::numeric_limits<uint64_t>::max() - S)
> NumSamples += S;
> else
> - NumSamples = std::numeric_limits<unsigned>::max();
> + NumSamples = std::numeric_limits<uint64_t>::max();
> }
>
> /// Add called function \p F with samples \p S.
> ///
> /// Sample counts accumulate using saturating arithmetic, to avoid
> wrapping
> /// around unsigned integers.
> - void addCalledTarget(StringRef F, unsigned S) {
> - unsigned &TargetSamples = CallTargets[F];
> - if (TargetSamples <= std::numeric_limits<unsigned>::max() - S)
> + void addCalledTarget(StringRef F, uint64_t S) {
> + uint64_t &TargetSamples = CallTargets[F];
> + if (TargetSamples <= std::numeric_limits<uint64_t>::max() - S)
> TargetSamples += S;
> else
> - TargetSamples = std::numeric_limits<unsigned>::max();
> + TargetSamples = std::numeric_limits<uint64_t>::max();
> }
>
> /// Return true if this sample record contains function calls.
> bool hasCalls() const { return CallTargets.size() > 0; }
>
> - unsigned getSamples() const { return NumSamples; }
> + uint64_t getSamples() const { return NumSamples; }
> const CallTargetMap &getCallTargets() const { return CallTargets; }
>
> /// Merge the samples in \p Other into this record.
> @@ -194,7 +194,7 @@ public:
> }
>
> private:
> - unsigned NumSamples;
> + uint64_t NumSamples;
> CallTargetMap CallTargets;
> };
>
> @@ -211,14 +211,15 @@ class FunctionSamples {
> public:
> FunctionSamples() : TotalSamples(0), TotalHeadSamples(0) {}
> void print(raw_ostream &OS = dbgs(), unsigned Indent = 0) const;
> - void addTotalSamples(unsigned Num) { TotalSamples += Num; }
> - void addHeadSamples(unsigned Num) { TotalHeadSamples += Num; }
> - void addBodySamples(int LineOffset, unsigned Discriminator, unsigned
> Num) {
> + void addTotalSamples(uint64_t Num) { TotalSamples += Num; }
> + void addHeadSamples(uint64_t Num) { TotalHeadSamples += Num; }
> + void addBodySamples(uint32_t LineOffset, uint32_t Discriminator,
> + uint64_t Num) {
> assert(LineOffset >= 0);
> BodySamples[LineLocation(LineOffset, Discriminator)].addSamples(Num);
> }
> - void addCalledTargetSamples(int LineOffset, unsigned Discriminator,
> - std::string FName, unsigned Num) {
> + void addCalledTargetSamples(uint32_t LineOffset, uint32_t Discriminator,
> + std::string FName, uint64_t Num) {
> assert(LineOffset >= 0);
> BodySamples[LineLocation(LineOffset,
> Discriminator)].addCalledTarget(FName,
>
> Num);
> @@ -227,8 +228,8 @@ public:
> /// Return the number of samples collected at the given location.
> /// Each location is specified by \p LineOffset and \p Discriminator.
> /// If the location is not found in profile, return error.
> - ErrorOr<unsigned> findSamplesAt(int LineOffset,
> - unsigned Discriminator) const {
> + ErrorOr<uint64_t> findSamplesAt(uint32_t LineOffset,
> + uint32_t Discriminator) const {
> const auto &ret = BodySamples.find(LineLocation(LineOffset,
> Discriminator));
> if (ret == BodySamples.end())
> return std::error_code();
> @@ -255,11 +256,11 @@ public:
> bool empty() const { return TotalSamples == 0; }
>
> /// Return the total number of samples collected inside the function.
> - unsigned getTotalSamples() const { return TotalSamples; }
> + uint64_t getTotalSamples() const { return TotalSamples; }
>
> /// Return the total number of samples collected at the head of the
> /// function.
> - unsigned getHeadSamples() const { return TotalHeadSamples; }
> + uint64_t getHeadSamples() const { return TotalHeadSamples; }
>
> /// Return all the samples collected in the body of the function.
> const BodySampleMap &getBodySamples() const { return BodySamples; }
> @@ -290,12 +291,12 @@ private:
> ///
> /// Samples are cumulative, they include all the samples collected
> /// inside this function and all its inlined callees.
> - unsigned TotalSamples;
> + uint64_t TotalSamples;
>
> /// Total number of samples collected at the head of the function.
> /// This is an approximation of the number of calls made to this
> function
> /// at runtime.
> - unsigned TotalHeadSamples;
> + uint64_t TotalHeadSamples;
>
> /// Map instruction locations to collected samples.
> ///
>
> Modified: llvm/trunk/include/llvm/ProfileData/SampleProfReader.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/SampleProfReader.h?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/SampleProfReader.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/SampleProfReader.h Thu Oct 15
> 11:36:21 2015
> @@ -138,10 +138,9 @@
> // FUNCTION BODY (one for each uninlined function body present in the
> profile)
> // NAME_IDX (uint32_t)
> // Index into the name table indicating the function name.
> -// SAMPLES (uint32_t)
> +// SAMPLES (uint64_t)
> // Total number of samples collected in this function.
> -// FIXME(dnovillo) this should be a uint64_t value.
> -// HEAD_SAMPLES (uint32_t)
> +// HEAD_SAMPLES (uint64_t)
> // Total number of samples collected at the head of the function.
> // NRECS (uint32_t)
> // Total number of sampling records this function's profile.
>
> Modified: llvm/trunk/include/llvm/ProfileData/SampleProfWriter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/SampleProfWriter.h?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ProfileData/SampleProfWriter.h (original)
> +++ llvm/trunk/include/llvm/ProfileData/SampleProfWriter.h Thu Oct 15
> 11:36:21 2015
> @@ -110,7 +110,7 @@ private:
> void addName(StringRef FName);
> void addNames(const FunctionSamples &S);
>
> - MapVector<StringRef, unsigned> NameTable;
> + MapVector<StringRef, uint32_t> NameTable;
> };
>
> } // End namespace sampleprof
>
> Modified: llvm/trunk/lib/ProfileData/SampleProfReader.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/SampleProfReader.cpp?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ProfileData/SampleProfReader.cpp (original)
> +++ llvm/trunk/lib/ProfileData/SampleProfReader.cpp Thu Oct 15 11:36:21
> 2015
> @@ -87,7 +87,7 @@ void SampleProfileReader::dump(raw_ostre
> ///
> /// \returns true if parsing is successful.
> static bool ParseHead(const StringRef &Input, StringRef &FName,
> - unsigned &NumSamples, unsigned &NumHeadSamples) {
> + uint64_t &NumSamples, uint64_t &NumHeadSamples) {
> if (Input[0] == ' ')
> return false;
> size_t n2 = Input.rfind(':');
> @@ -111,10 +111,10 @@ static bool ParseHead(const StringRef &I
> /// \param TargetCountMap map from indirect call target to count.
> ///
> /// returns true if parsing is successful.
> -static bool ParseLine(const StringRef &Input, bool &IsCallsite, unsigned
> &Depth,
> - unsigned &NumSamples, unsigned &LineOffset,
> - unsigned &Discriminator, StringRef &CalleeName,
> - DenseMap<StringRef, unsigned> &TargetCountMap) {
> +static bool ParseLine(const StringRef &Input, bool &IsCallsite, uint32_t
> &Depth,
> + uint64_t &NumSamples, uint32_t &LineOffset,
> + uint32_t &Discriminator, StringRef &CalleeName,
> + DenseMap<StringRef, uint64_t> &TargetCountMap) {
> for (Depth = 0; Input[Depth] == ' '; Depth++)
> ;
> if (Depth == 0)
> @@ -153,15 +153,15 @@ static bool ParseLine(const StringRef &I
> if (n3 != StringRef::npos) {
> pair = Rest.substr(0, n3);
> }
> - int n4 = pair.find(':');
> - unsigned count;
> + size_t n4 = pair.find(':');
> + uint64_t count;
> if (pair.substr(n4 + 1).getAsInteger(10, count))
> return false;
> TargetCountMap[pair.substr(0, n4)] = count;
> }
> } else {
> IsCallsite = true;
> - int n3 = Rest.find_last_of(':');
> + size_t n3 = Rest.find_last_of(':');
> CalleeName = Rest.substr(0, n3);
> if (Rest.substr(n3 + 1).getAsInteger(10, NumSamples))
> return false;
> @@ -196,7 +196,7 @@ std::error_code SampleProfileReaderText:
> // The only requirement we place on the identifier, then, is that it
> // should not begin with a number.
> if ((*LineIt)[0] != ' ') {
> - unsigned NumSamples, NumHeadSamples;
> + uint64_t NumSamples, NumHeadSamples;
> StringRef FName;
> if (!ParseHead(*LineIt, FName, NumSamples, NumHeadSamples)) {
> reportError(LineIt.line_number(),
> @@ -210,11 +210,11 @@ std::error_code SampleProfileReaderText:
> InlineStack.clear();
> InlineStack.push_back(&FProfile);
> } else {
> - unsigned NumSamples;
> + uint64_t NumSamples;
> StringRef FName;
> - DenseMap<StringRef, unsigned> TargetCountMap;
> + DenseMap<StringRef, uint64_t> TargetCountMap;
> bool IsCallsite;
> - unsigned Depth, LineOffset, Discriminator;
> + uint32_t Depth, LineOffset, Discriminator;
> if (!ParseLine(*LineIt, IsCallsite, Depth, NumSamples, LineOffset,
> Discriminator, FName, TargetCountMap)) {
> reportError(LineIt.line_number(),
> @@ -283,7 +283,7 @@ ErrorOr<StringRef> SampleProfileReaderBi
>
> ErrorOr<StringRef> SampleProfileReaderBinary::readStringFromTable() {
> std::error_code EC;
> - auto Idx = readNumber<unsigned>();
> + auto Idx = readNumber<uint32_t>();
> if (std::error_code EC = Idx.getError())
> return EC;
> if (*Idx >= NameTable.size())
> @@ -293,22 +293,22 @@ ErrorOr<StringRef> SampleProfileReaderBi
>
> std::error_code
> SampleProfileReaderBinary::readProfile(FunctionSamples &FProfile) {
> - auto Val = readNumber<unsigned>();
> + auto Val = readNumber<uint64_t>();
> if (std::error_code EC = Val.getError())
> return EC;
> FProfile.addTotalSamples(*Val);
>
> - Val = readNumber<unsigned>();
> + Val = readNumber<uint64_t>();
> if (std::error_code EC = Val.getError())
> return EC;
> FProfile.addHeadSamples(*Val);
>
> // Read the samples in the body.
> - auto NumRecords = readNumber<unsigned>();
> + auto NumRecords = readNumber<uint32_t>();
> if (std::error_code EC = NumRecords.getError())
> return EC;
>
> - for (unsigned I = 0; I < *NumRecords; ++I) {
> + for (uint32_t I = 0; I < *NumRecords; ++I) {
> auto LineOffset = readNumber<uint64_t>();
> if (std::error_code EC = LineOffset.getError())
> return EC;
> @@ -321,11 +321,11 @@ SampleProfileReaderBinary::readProfile(F
> if (std::error_code EC = NumSamples.getError())
> return EC;
>
> - auto NumCalls = readNumber<unsigned>();
> + auto NumCalls = readNumber<uint32_t>();
> if (std::error_code EC = NumCalls.getError())
> return EC;
>
> - for (unsigned J = 0; J < *NumCalls; ++J) {
> + for (uint32_t J = 0; J < *NumCalls; ++J) {
> auto CalledFunction(readStringFromTable());
> if (std::error_code EC = CalledFunction.getError())
> return EC;
> @@ -342,11 +342,11 @@ SampleProfileReaderBinary::readProfile(F
> }
>
> // Read all the samples for inlined function calls.
> - auto NumCallsites = readNumber<unsigned>();
> + auto NumCallsites = readNumber<uint32_t>();
> if (std::error_code EC = NumCallsites.getError())
> return EC;
>
> - for (unsigned J = 0; J < *NumCallsites; ++J) {
> + for (uint32_t J = 0; J < *NumCallsites; ++J) {
> auto LineOffset = readNumber<uint64_t>();
> if (std::error_code EC = LineOffset.getError())
> return EC;
> @@ -403,11 +403,11 @@ std::error_code SampleProfileReaderBinar
> return sampleprof_error::unsupported_version;
>
> // Read the name table.
> - auto Size = readNumber<size_t>();
> + auto Size = readNumber<uint32_t>();
> if (std::error_code EC = Size.getError())
> return EC;
> NameTable.reserve(*Size);
> - for (size_t I = 0; I < *Size; ++I) {
> + for (uint32_t I = 0; I < *Size; ++I) {
> auto Name(readString());
> if (std::error_code EC = Name.getError())
> return EC;
> @@ -678,7 +678,7 @@ setupMemoryBuffer(std::string Filename)
> auto Buffer = std::move(BufferOrErr.get());
>
> // Sanity check the file.
> - if (Buffer->getBufferSize() > std::numeric_limits<unsigned>::max())
> + if (Buffer->getBufferSize() > std::numeric_limits<uint32_t>::max())
> return sampleprof_error::too_large;
>
> return std::move(Buffer);
>
> Modified: llvm/trunk/lib/ProfileData/SampleProfWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/SampleProfWriter.cpp?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ProfileData/SampleProfWriter.cpp (original)
> +++ llvm/trunk/lib/ProfileData/SampleProfWriter.cpp Thu Oct 15 11:36:21
> 2015
> @@ -144,7 +144,7 @@ std::error_code SampleProfileWriterBinar
> encodeULEB128(Sample.getCallTargets().size(), OS);
> for (const auto &J : Sample.getCallTargets()) {
> StringRef Callee = J.first();
> - unsigned CalleeSamples = J.second;
> + uint64_t CalleeSamples = J.second;
> if (std::error_code EC = writeNameIdx(Callee))
> return EC;
> encodeULEB128(CalleeSamples, OS);
>
> Modified: llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp?rev=250427&r1=250426&r2=250427&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/SampleProfile.cpp Thu Oct 15 11:36:21
> 2015
> @@ -65,10 +65,10 @@ static cl::opt<unsigned> SampleProfileMa
> "sample block/edge weights through the CFG."));
>
> namespace {
> -typedef DenseMap<const BasicBlock *, unsigned> BlockWeightMap;
> +typedef DenseMap<const BasicBlock *, uint64_t> BlockWeightMap;
> typedef DenseMap<const BasicBlock *, const BasicBlock *>
> EquivalenceClassMap;
> typedef std::pair<const BasicBlock *, const BasicBlock *> Edge;
> -typedef DenseMap<Edge, unsigned> EdgeWeightMap;
> +typedef DenseMap<Edge, uint64_t> EdgeWeightMap;
> typedef DenseMap<const BasicBlock *, SmallVector<const BasicBlock *, 8>>
> BlockEdgeMap;
>
> @@ -104,8 +104,8 @@ protected:
> bool runOnFunction(Function &F);
> unsigned getFunctionLoc(Function &F);
> bool emitAnnotations(Function &F);
> - ErrorOr<unsigned> getInstWeight(const Instruction &I) const;
> - ErrorOr<unsigned> getBlockWeight(const BasicBlock *BB) const;
> + ErrorOr<uint64_t> getInstWeight(const Instruction &I) const;
> + ErrorOr<uint64_t> getBlockWeight(const BasicBlock *BB) const;
> const FunctionSamples *findCalleeFunctionSamples(const CallInst &I)
> const;
> const FunctionSamples *findFunctionSamples(const Instruction &I) const;
> bool inlineHotFunctions(Function &F);
> @@ -118,7 +118,7 @@ protected:
> SmallVector<BasicBlock *, 8> Descendants,
> DominatorTreeBase<BasicBlock> *DomTree);
> void propagateWeights(Function &F);
> - unsigned visitEdge(Edge E, unsigned *NumUnknownEdges, Edge
> *UnknownEdge);
> + uint64_t visitEdge(Edge E, unsigned *NumUnknownEdges, Edge
> *UnknownEdge);
> void buildEdges(Function &F);
> bool propagateThroughEdges(Function &F);
> void computeDominanceAndLoopInfo(Function &F);
> @@ -201,7 +201,7 @@ void SampleProfileLoader::printBlockEqui
> void SampleProfileLoader::printBlockWeight(raw_ostream &OS,
> const BasicBlock *BB) const {
> const auto &I = BlockWeights.find(BB);
> - unsigned W = (I == BlockWeights.end() ? 0 : I->second);
> + uint64_t W = (I == BlockWeights.end() ? 0 : I->second);
> OS << "weight[" << BB->getName() << "]: " << W << "\n";
> }
>
> @@ -216,7 +216,7 @@ void SampleProfileLoader::printBlockWeig
> /// \param Inst Instruction to query.
> ///
> /// \returns the weight of \p Inst.
> -ErrorOr<unsigned>
> +ErrorOr<uint64_t>
> SampleProfileLoader::getInstWeight(const Instruction &Inst) const {
> DebugLoc DLoc = Inst.getDebugLoc();
> if (!DLoc)
> @@ -232,7 +232,7 @@ SampleProfileLoader::getInstWeight(const
> if (Lineno < HeaderLineno)
> return std::error_code();
>
> - ErrorOr<unsigned> R =
> + ErrorOr<uint64_t> R =
> FS->findSamplesAt(Lineno - HeaderLineno, DIL->getDiscriminator());
> if (R)
> DEBUG(dbgs() << " " << Lineno << "." << DIL->getDiscriminator() <<
> ":"
> @@ -250,12 +250,12 @@ SampleProfileLoader::getInstWeight(const
> /// \param BB The basic block to query.
> ///
> /// \returns the weight for \p BB.
> -ErrorOr<unsigned>
> +ErrorOr<uint64_t>
> SampleProfileLoader::getBlockWeight(const BasicBlock *BB) const {
> bool Found = false;
> - unsigned Weight = 0;
> + uint64_t Weight = 0;
> for (auto &I : BB->getInstList()) {
> - const ErrorOr<unsigned> &R = getInstWeight(I);
> + const ErrorOr<uint64_t> &R = getInstWeight(I);
> if (R && R.get() >= Weight) {
> Weight = R.get();
> Found = true;
> @@ -277,7 +277,7 @@ bool SampleProfileLoader::computeBlockWe
> bool Changed = false;
> DEBUG(dbgs() << "Block weights\n");
> for (const auto &BB : F) {
> - ErrorOr<unsigned> Weight = getBlockWeight(&BB);
> + ErrorOr<uint64_t> Weight = getBlockWeight(&BB);
> if (Weight) {
> BlockWeights[&BB] = Weight.get();
> VisitedBlocks.insert(&BB);
> @@ -431,7 +431,7 @@ void SampleProfileLoader::findEquivalenc
> BasicBlock *BB1, SmallVector<BasicBlock *, 8> Descendants,
> DominatorTreeBase<BasicBlock> *DomTree) {
> const BasicBlock *EC = EquivalenceClass[BB1];
> - unsigned Weight = BlockWeights[EC];
> + uint64_t Weight = BlockWeights[EC];
> for (const auto *BB2 : Descendants) {
> bool IsDomParent = DomTree->dominates(BB2, BB1);
> bool IsInSameLoop = LI->getLoopFor(BB1) == LI->getLoopFor(BB2);
> @@ -520,7 +520,7 @@ void SampleProfileLoader::findEquivalenc
> /// \param UnknownEdge Set if E has not been visited before.
> ///
> /// \returns E's weight, if known. Otherwise, return 0.
> -unsigned SampleProfileLoader::visitEdge(Edge E, unsigned *NumUnknownEdges,
> +uint64_t SampleProfileLoader::visitEdge(Edge E, unsigned *NumUnknownEdges,
> Edge *UnknownEdge) {
> if (!VisitedEdges.count(E)) {
> (*NumUnknownEdges)++;
> @@ -555,7 +555,7 @@ bool SampleProfileLoader::propagateThrou
> // only case we are interested in handling is when only a single
> // edge is unknown (see setEdgeOrBlockWeight).
> for (unsigned i = 0; i < 2; i++) {
> - unsigned TotalWeight = 0;
> + uint64_t TotalWeight = 0;
> unsigned NumUnknownEdges = 0;
> Edge UnknownEdge, SelfReferentialEdge;
>
> @@ -599,7 +599,7 @@ bool SampleProfileLoader::propagateThrou
> // all edges will get a weight, or iteration will stop when
> // it reaches SampleProfileMaxPropagateIterations.
> if (NumUnknownEdges <= 1) {
> - unsigned &BBWeight = BlockWeights[EC];
> + uint64_t &BBWeight = BlockWeights[EC];
> if (NumUnknownEdges == 0) {
> // If we already know the weight of all edges, the weight of the
> // basic block can be computed. It should be no larger than the
> sum
> @@ -626,7 +626,7 @@ bool SampleProfileLoader::propagateThrou
> printEdgeWeight(dbgs(), UnknownEdge));
> }
> } else if (SelfReferentialEdge.first && VisitedBlocks.count(EC)) {
> - unsigned &BBWeight = BlockWeights[BB];
> + uint64_t &BBWeight = BlockWeights[BB];
> // We have a self-referential edge and the weight of BB is known.
> if (BBWeight >= TotalWeight)
> EdgeWeights[SelfReferentialEdge] = BBWeight - TotalWeight;
> @@ -692,7 +692,7 @@ void SampleProfileLoader::buildEdges(Fun
> /// known).
> void SampleProfileLoader::propagateWeights(Function &F) {
> bool Changed = true;
> - unsigned i = 0;
> + unsigned I = 0;
>
> // Add an entry count to the function using the samples gathered
> // at the function entry.
> @@ -706,7 +706,7 @@ void SampleProfileLoader::propagateWeigh
> buildEdges(F);
>
> // Propagate until we converge or we go past the iteration limit.
> - while (Changed && i++ < SampleProfileMaxPropagateIterations) {
> + while (Changed && I++ < SampleProfileMaxPropagateIterations) {
> Changed = propagateThroughEdges(F);
> }
>
> @@ -724,14 +724,21 @@ void SampleProfileLoader::propagateWeigh
>
> DEBUG(dbgs() << "\nGetting weights for branch at line "
> << TI->getDebugLoc().getLine() << ".\n");
> - SmallVector<unsigned, 4> Weights;
> + SmallVector<uint32_t, 4> Weights;
> bool AllWeightsZero = true;
> for (unsigned I = 0; I < TI->getNumSuccessors(); ++I) {
> BasicBlock *Succ = TI->getSuccessor(I);
> Edge E = std::make_pair(BB, Succ);
> - unsigned Weight = EdgeWeights[E];
> + uint64_t Weight = EdgeWeights[E];
> DEBUG(dbgs() << "\t"; printEdgeWeight(dbgs(), E));
> - Weights.push_back(Weight);
> + // Use uint32_t saturated arithmetic to adjust the incoming weights,
> + // if needed. Sample counts in profiles are 64-bit unsigned values,
> + // but internally branch weights are expressed as 32-bit values.
> + if (Weight > std::numeric_limits<uint32_t>::max()) {
> + DEBUG(dbgs() << " (saturated due to uint32_t overflow)");
> + Weight = std::numeric_limits<uint32_t>::max();
> + }
> + Weights.push_back(static_cast<uint32_t>(Weight));
> if (Weight != 0)
> AllWeightsZero = false;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151015/878fc513/attachment-0001.html>
More information about the llvm-commits
mailing list