From 7de0a38604735add9cc9959d99b44fa5ebe6fe19 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Tue, 24 Nov 2015 23:36:52 +0000 Subject: [PATCH] [PGO] Add mapper callback to interfaces retrieving value data for site (NFC) This allows cleaner implementation and merging retrieving/mapping in one pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254038 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ProfileData/InstrProf.h | 23 +++++++++++++++-------- lib/ProfileData/InstrProf.cpp | 24 +++++++++++++----------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index 20d1574b309..3ad20e9c426 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -261,9 +261,11 @@ struct InstrProfRecord { uint32_t Site) const; /// Return the array of profiled values at \p Site. inline std::unique_ptr - getValueForSite(uint32_t ValueKind, uint32_t Site) const; - inline void getValueForSite(InstrProfValueData Dest[], uint32_t ValueKind, - uint32_t Site) const; + getValueForSite(uint32_t ValueKind, uint32_t Site, + uint64_t (*ValueMapper)(uint32_t, uint64_t) = 0) const; + inline void + getValueForSite(InstrProfValueData Dest[], uint32_t ValueKind, uint32_t Site, + uint64_t (*ValueMapper)(uint32_t, uint64_t) = 0) const; /// Reserve space for NumValueSites sites. inline void reserveSites(uint32_t ValueKind, uint32_t NumValueSites); /// Add ValueData for ValueKind at value Site. @@ -365,22 +367,27 @@ uint32_t InstrProfRecord::getNumValueDataForSite(uint32_t ValueKind, return getValueSitesForKind(ValueKind)[Site].ValueData.size(); } -std::unique_ptr -InstrProfRecord::getValueForSite(uint32_t ValueKind, uint32_t Site) const { +std::unique_ptr InstrProfRecord::getValueForSite( + uint32_t ValueKind, uint32_t Site, + uint64_t (*ValueMapper)(uint32_t, uint64_t)) const { uint32_t N = getNumValueDataForSite(ValueKind, Site); if (N == 0) return std::unique_ptr(nullptr); auto VD = llvm::make_unique(N); - getValueForSite(VD.get(), ValueKind, Site); + getValueForSite(VD.get(), ValueKind, Site, ValueMapper); return VD; } + void InstrProfRecord::getValueForSite(InstrProfValueData Dest[], - uint32_t ValueKind, uint32_t Site) const { + uint32_t ValueKind, uint32_t Site, + uint64_t (*ValueMapper)(uint32_t, + uint64_t)) const { uint32_t I = 0; for (auto V : getValueSitesForKind(ValueKind)[Site].ValueData) { - Dest[I] = V; + Dest[I].Value = ValueMapper ? ValueMapper(ValueKind, V.Value) : V.Value; + Dest[I].Count = V.Count; I++; } } diff --git a/lib/ProfileData/InstrProf.cpp b/lib/ProfileData/InstrProf.cpp index 256a98f3650..1d2896c8583 100644 --- a/lib/ProfileData/InstrProf.cpp +++ b/lib/ProfileData/InstrProf.cpp @@ -131,6 +131,18 @@ GlobalVariable *createPGOFuncNameVar(Function &F, StringRef FuncName) { return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), FuncName); } +uint64_t StringToHash(uint32_t ValueKind, uint64_t Value) { + switch (ValueKind) { + case IPVK_IndirectCallTarget: + return IndexedInstrProf::ComputeHash(IndexedInstrProf::HashType, + (const char *)Value); + break; + default: + llvm_unreachable("value kind not handled !"); + } + return Value; +} + void ValueProfRecord::deserializeTo(InstrProfRecord &Record, InstrProfRecord::ValueMapType *VMap) { Record.reserveSites(Kind, NumValueSites); @@ -152,17 +164,7 @@ void ValueProfRecord::serializeFrom(const InstrProfRecord &Record, for (uint32_t S = 0; S < NumValueSites; S++) { uint32_t ND = Record.getNumValueDataForSite(ValueKind, S); SiteCountArray[S] = ND; - Record.getValueForSite(DstVD, ValueKind, S); - for (uint32_t I = 0; I < ND; I++) { - switch (ValueKind) { - case IPVK_IndirectCallTarget: - DstVD[I].Value = IndexedInstrProf::ComputeHash( - IndexedInstrProf::HashType, (const char *)DstVD[I].Value); - break; - default: - llvm_unreachable("value kind not handled !"); - } - } + Record.getValueForSite(DstVD, ValueKind, S, StringToHash); DstVD += ND; } } -- 2.11.0