[llvm] r302108 - IR: Use pointers instead of GUIDs to represent edges in the module summary. NFCI.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Thu May 4 11:17:44 PDT 2017
Thanks for taking care of that. Re-applied with a fix in r302176.
Peter
On Thu, May 4, 2017 at 5:03 AM, Eric Liu via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> This has been reverted by r302140
>
>
> On Thu, May 4, 2017 at 1:45 PM Eric Liu <ioeric at google.com> wrote:
>
>> Hi Peter,
>>
>> This revision causes crash in clang bootstrap in our internal
>> integration. I'll revert this for now and send you the repro instructions
>> separately. Sorry about that.
>>
>> - Eric
>>
>> On Thu, May 4, 2017 at 5:49 AM Peter Collingbourne via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: pcc
>>> Date: Wed May 3 22:36:16 2017
>>> New Revision: 302108
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=302108&view=rev
>>> Log:
>>> IR: Use pointers instead of GUIDs to represent edges in the module
>>> summary. NFCI.
>>>
>>> When profiling a no-op incremental link of Chromium I found that the
>>> functions
>>> computeImportForFunction and computeDeadSymbols were consuming roughly
>>> 10% of
>>> the profile. The goal of this change is to improve the performance of
>>> those
>>> functions by changing the map lookups that they were previously doing
>>> into
>>> pointer dereferences.
>>>
>>> This is achieved by changing the ValueInfo data structure to be a
>>> pointer to
>>> an element of the global value map owned by ModuleSummaryIndex, and
>>> changing
>>> reference lists in the GlobalValueSummary to hold ValueInfos instead of
>>> GUIDs.
>>> This means that a ValueInfo will take a client directly to the summary
>>> list
>>> for a given GUID.
>>>
>>> Differential Revision: https://reviews.llvm.org/D32471
>>>
>>> Modified:
>>> llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h
>>> llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h
>>> llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
>>> llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>>> llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>>> llvm/trunk/lib/IR/ModuleSummaryIndex.cpp
>>> llvm/trunk/lib/LTO/LTO.cpp
>>> llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>>> llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp
>>> llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp
>>> llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp
>>> llvm/trunk/tools/llvm-link/llvm-link.cpp
>>> llvm/trunk/tools/llvm-lto/llvm-lto.cpp
>>>
>>> Modified: llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
>>> llvm/IR/ModuleSummaryIndex.h?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h (original)
>>> +++ llvm/trunk/include/llvm/IR/ModuleSummaryIndex.h Wed May 3 22:36:16
>>> 2017
>>> @@ -45,58 +45,54 @@ struct CalleeInfo {
>>> }
>>> };
>>>
>>> -/// Struct to hold value either by GUID or GlobalValue*. Values in
>>> combined
>>> -/// indexes as well as indirect calls are GUIDs, all others are
>>> GlobalValues.
>>> -struct ValueInfo {
>>> - /// The value representation used in this instance.
>>> - enum ValueInfoKind {
>>> - VI_GUID,
>>> - VI_Value,
>>> - };
>>> +class GlobalValueSummary;
>>>
>>> - /// Union of the two possible value types.
>>> - union ValueUnion {
>>> - GlobalValue::GUID Id;
>>> - const GlobalValue *GV;
>>> - ValueUnion(GlobalValue::GUID Id) : Id(Id) {}
>>> - ValueUnion(const GlobalValue *GV) : GV(GV) {}
>>> - };
>>> +typedef std::vector<std::unique_ptr<GlobalValueSummary>>
>>> GlobalValueSummaryList;
>>>
>>> - /// The value being represented.
>>> - ValueUnion TheValue;
>>> - /// The value representation.
>>> - ValueInfoKind Kind;
>>> - /// Constructor for a GUID value
>>> - ValueInfo(GlobalValue::GUID Id = 0) : TheValue(Id), Kind(VI_GUID) {}
>>> - /// Constructor for a GlobalValue* value
>>> - ValueInfo(const GlobalValue *V) : TheValue(V), Kind(VI_Value) {}
>>> - /// Accessor for GUID value
>>> - GlobalValue::GUID getGUID() const {
>>> - assert(Kind == VI_GUID && "Not a GUID type");
>>> - return TheValue.Id;
>>> - }
>>> - /// Accessor for GlobalValue* value
>>> - const GlobalValue *getValue() const {
>>> - assert(Kind == VI_Value && "Not a Value type");
>>> - return TheValue.GV;
>>> +struct GlobalValueSummaryInfo {
>>> + /// The GlobalValue corresponding to this summary. This is only used
>>> in
>>> + /// per-module summaries.
>>> + const GlobalValue *GV = nullptr;
>>> +
>>> + /// List of global value summary structures for a particular value
>>> held
>>> + /// in the GlobalValueMap. Requires a vector in the case of multiple
>>> + /// COMDAT values of the same name.
>>> + GlobalValueSummaryList SummaryList;
>>> +};
>>> +
>>> +/// Map from global value GUID to corresponding summary structures. Use
>>> a
>>> +/// std::map rather than a DenseMap so that pointers to the map's
>>> value_type
>>> +/// (which are used by ValueInfo) are not invalidated by insertion.
>>> Also it will
>>> +/// likely incur less overhead, as the value type is not very small and
>>> the size
>>> +/// of the map is unknown, resulting in inefficiencies due to repeated
>>> +/// insertions and resizing.
>>> +typedef std::map<GlobalValue::GUID, GlobalValueSummaryInfo>
>>> + GlobalValueSummaryMapTy;
>>> +
>>> +/// Struct that holds a reference to a particular GUID in a global value
>>> +/// summary.
>>> +struct ValueInfo {
>>> + const GlobalValueSummaryMapTy::value_type *Ref = nullptr;
>>> + ValueInfo() = default;
>>> + ValueInfo(const GlobalValueSummaryMapTy::value_type *Ref) : Ref(Ref)
>>> {}
>>> + operator bool() const { return Ref; }
>>> +
>>> + GlobalValue::GUID getGUID() const { return Ref->first; }
>>> + const GlobalValue *getValue() const { return Ref->second.GV; }
>>> + ArrayRef<std::unique_ptr<GlobalValueSummary>> getSummaryList() const
>>> {
>>> + return Ref->second.SummaryList;
>>> }
>>> - bool isGUID() const { return Kind == VI_GUID; }
>>> };
>>>
>>> template <> struct DenseMapInfo<ValueInfo> {
>>> - static inline ValueInfo getEmptyKey() { return ValueInfo((GlobalValue
>>> *)-1); }
>>> - static inline ValueInfo getTombstoneKey() {
>>> - return ValueInfo((GlobalValue *)-2);
>>> - }
>>> - static bool isEqual(ValueInfo L, ValueInfo R) {
>>> - if (L.isGUID() != R.isGUID())
>>> - return false;
>>> - return L.isGUID() ? (L.getGUID() == R.getGUID())
>>> - : (L.getValue() == R.getValue());
>>> + static inline ValueInfo getEmptyKey() {
>>> + return ValueInfo((GlobalValueSummaryMapTy::value_type *)-1);
>>> }
>>> - static unsigned getHashValue(ValueInfo I) {
>>> - return I.isGUID() ? I.getGUID() : (uintptr_t)I.getValue();
>>> + static inline ValueInfo getTombstoneKey() {
>>> + return ValueInfo((GlobalValueSummaryMapTy::value_type *)-2);
>>> }
>>> + static bool isEqual(ValueInfo L, ValueInfo R) { return L.Ref ==
>>> R.Ref; }
>>> + static unsigned getHashValue(ValueInfo I) { return (uintptr_t)I.Ref; }
>>> };
>>>
>>> /// \brief Function and variable summary information to aid decisions
>>> and
>>> @@ -483,19 +479,6 @@ struct TypeIdSummary {
>>> /// 160 bits SHA1
>>> typedef std::array<uint32_t, 5> ModuleHash;
>>>
>>> -/// List of global value summary structures for a particular value held
>>> -/// in the GlobalValueMap. Requires a vector in the case of multiple
>>> -/// COMDAT values of the same name.
>>> -typedef std::vector<std::unique_ptr<GlobalValueSummary>>
>>> GlobalValueSummaryList;
>>> -
>>> -/// Map from global value GUID to corresponding summary structures.
>>> -/// Use a std::map rather than a DenseMap since it will likely incur
>>> -/// less overhead, as the value type is not very small and the size
>>> -/// of the map is unknown, resulting in inefficiencies due to repeated
>>> -/// insertions and resizing.
>>> -typedef std::map<GlobalValue::GUID, GlobalValueSummaryList>
>>> - GlobalValueSummaryMapTy;
>>> -
>>> /// Type used for iterating through the global value summary map.
>>> typedef GlobalValueSummaryMapTy::const_iterator
>>> const_gvsummary_iterator;
>>> typedef GlobalValueSummaryMapTy::iterator gvsummary_iterator;
>>> @@ -532,6 +515,11 @@ private:
>>> // YAML I/O support.
>>> friend yaml::MappingTraits<ModuleSummaryIndex>;
>>>
>>> + GlobalValueSummaryMapTy::value_type *
>>> + getOrInsertValuePtr(GlobalValue::GUID GUID) {
>>> + return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo{}).
>>> first;
>>> + }
>>> +
>>> public:
>>> gvsummary_iterator begin() { return GlobalValueMap.begin(); }
>>> const_gvsummary_iterator begin() const { return
>>> GlobalValueMap.begin(); }
>>> @@ -539,21 +527,22 @@ public:
>>> const_gvsummary_iterator end() const { return GlobalValueMap.end(); }
>>> size_t size() const { return GlobalValueMap.size(); }
>>>
>>> - /// Get the list of global value summary objects for a given value
>>> name.
>>> - const GlobalValueSummaryList &getGlobalValueSummaryList(StringRef
>>> ValueName) {
>>> - return GlobalValueMap[GlobalValue::getGUID(ValueName)];
>>> - }
>>> -
>>> - /// Get the list of global value summary objects for a given value
>>> name.
>>> - const const_gvsummary_iterator
>>> - findGlobalValueSummaryList(StringRef ValueName) const {
>>> - return GlobalValueMap.find(GlobalValue::getGUID(ValueName));
>>> - }
>>> -
>>> - /// Get the list of global value summary objects for a given value
>>> GUID.
>>> - const const_gvsummary_iterator
>>> - findGlobalValueSummaryList(GlobalValue::GUID ValueGUID) const {
>>> - return GlobalValueMap.find(ValueGUID);
>>> + /// Return a ValueInfo for GUID if it exists, otherwise return
>>> ValueInfo().
>>> + ValueInfo getValueInfo(GlobalValue::GUID GUID) const {
>>> + auto I = GlobalValueMap.find(GUID);
>>> + return ValueInfo(I == GlobalValueMap.end() ? nullptr : &*I);
>>> + }
>>> +
>>> + /// Return a ValueInfo for \p GUID.
>>> + ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID) {
>>> + return ValueInfo(getOrInsertValuePtr(GUID));
>>> + }
>>> +
>>> + /// Return a ValueInfo for \p GV and mark it as belonging to GV.
>>> + ValueInfo getOrInsertValueInfo(const GlobalValue *GV) {
>>> + auto VP = getOrInsertValuePtr(GV->getGUID());
>>> + VP->second.GV = GV;
>>> + return ValueInfo(VP);
>>> }
>>>
>>> /// Return the GUID for \p OriginalId in the OidGuidMap.
>>> @@ -565,17 +554,18 @@ public:
>>> /// Add a global value summary for a value of the given name.
>>> void addGlobalValueSummary(StringRef ValueName,
>>> std::unique_ptr<GlobalValueSummary>
>>> Summary) {
>>> - addOriginalName(GlobalValue::getGUID(ValueName),
>>> - Summary->getOriginalName());
>>> - GlobalValueMap[GlobalValue::getGUID(ValueName)].push_back(
>>> - std::move(Summary));
>>> + addGlobalValueSummary(getOrInsertValueInfo(GlobalValue::getGUID(
>>> ValueName)),
>>> + std::move(Summary));
>>> }
>>>
>>> - /// Add a global value summary for a value of the given GUID.
>>> - void addGlobalValueSummary(GlobalValue::GUID ValueGUID,
>>> + /// Add a global value summary for the given ValueInfo.
>>> + void addGlobalValueSummary(ValueInfo VI,
>>> std::unique_ptr<GlobalValueSummary>
>>> Summary) {
>>> - addOriginalName(ValueGUID, Summary->getOriginalName());
>>> - GlobalValueMap[ValueGUID].push_back(std::move(Summary));
>>> + addOriginalName(VI.getGUID(), Summary->getOriginalName());
>>> + // Here we have a notionally const VI, but the value it points to
>>> is owned
>>> + // by the non-const *this.
>>> + const_cast<GlobalValueSummaryMapTy::value_type *>(VI.Ref)
>>> + ->second.SummaryList.push_back(std::move(Summary));
>>> }
>>>
>>> /// Add an original name for the value of the given GUID.
>>> @@ -593,16 +583,16 @@ public:
>>> /// not found.
>>> GlobalValueSummary *findSummaryInModule(GlobalValue::GUID ValueGUID,
>>> StringRef ModuleId) const {
>>> - auto CalleeInfoList = findGlobalValueSummaryList(ValueGUID);
>>> - if (CalleeInfoList == end()) {
>>> + auto CalleeInfo = getValueInfo(ValueGUID);
>>> + if (!CalleeInfo) {
>>> return nullptr; // This function does not have a summary
>>> }
>>> auto Summary =
>>> - llvm::find_if(CalleeInfoList->second,
>>> + llvm::find_if(CalleeInfo.getSummaryList(),
>>> [&](const std::unique_ptr<GlobalValueSummary>
>>> &Summary) {
>>> return Summary->modulePath() == ModuleId;
>>> });
>>> - if (Summary == CalleeInfoList->second.end())
>>> + if (Summary == CalleeInfo.getSummaryList().end())
>>> return nullptr;
>>> return Summary->get();
>>> }
>>>
>>> Modified: llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/
>>> ModuleSummaryIndexYAML.h?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h (original)
>>> +++ llvm/trunk/include/llvm/IR/ModuleSummaryIndexYAML.h Wed May 3
>>> 22:36:16 2017
>>> @@ -201,7 +201,7 @@ template <> struct CustomMappingTraits<G
>>> for (auto &FSum : FSums) {
>>> GlobalValueSummary::GVFlags GVFlags(GlobalValue::ExternalLinkage,
>>> false,
>>> false);
>>> - Elem.push_back(llvm::make_unique<FunctionSummary>(
>>> + Elem.SummaryList.push_back(llvm::make_unique<FunctionSummary>(
>>> GVFlags, 0, ArrayRef<ValueInfo>{},
>>> ArrayRef<FunctionSummary::EdgeTy>{},
>>> std::move(FSum.TypeTests),
>>> std::move(FSum.TypeTestAssumeVCalls),
>>> @@ -213,7 +213,7 @@ template <> struct CustomMappingTraits<G
>>> static void output(IO &io, GlobalValueSummaryMapTy &V) {
>>> for (auto &P : V) {
>>> std::vector<FunctionSummaryYaml> FSums;
>>> - for (auto &Sum : P.second) {
>>> + for (auto &Sum : P.second.SummaryList) {
>>> if (auto *FSum = dyn_cast<FunctionSummary>(Sum.get()))
>>> FSums.push_back(FunctionSummaryYaml{
>>> FSum->type_tests(), FSum->type_test_assume_vcalls(),
>>>
>>> Modified: llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/
>>> ModuleSummaryAnalysis.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp (original)
>>> +++ llvm/trunk/lib/Analysis/ModuleSummaryAnalysis.cpp Wed May 3
>>> 22:36:16 2017
>>> @@ -37,7 +37,8 @@ using namespace llvm;
>>> // Walk through the operands of a given User via worklist iteration and
>>> populate
>>> // the set of GlobalValue references encountered. Invoked either on an
>>> // Instruction or a GlobalVariable (which walks its initializer).
>>> -static void findRefEdges(const User *CurUser, SetVector<ValueInfo>
>>> &RefEdges,
>>> +static void findRefEdges(ModuleSummaryIndex &Index, const User
>>> *CurUser,
>>> + SetVector<ValueInfo> &RefEdges,
>>> SmallPtrSet<const User *, 8> &Visited) {
>>> SmallVector<const User *, 32> Worklist;
>>> Worklist.push_back(CurUser);
>>> @@ -61,7 +62,7 @@ static void findRefEdges(const User *Cur
>>> // the reference set unless it is a callee. Callees are handled
>>> // specially by WriteFunction and are added to a separate list.
>>> if (!(CS && CS.isCallee(&OI)))
>>> - RefEdges.insert(GV);
>>> + RefEdges.insert(Index.getOrInsertValueInfo(GV));
>>> continue;
>>> }
>>> Worklist.push_back(Operand);
>>> @@ -198,7 +199,7 @@ computeFunctionSummary(ModuleSummaryInde
>>> if (isa<DbgInfoIntrinsic>(I))
>>> continue;
>>> ++NumInsts;
>>> - findRefEdges(&I, RefEdges, Visited);
>>> + findRefEdges(Index, &I, RefEdges, Visited);
>>> auto CS = ImmutableCallSite(&I);
>>> if (!CS)
>>> continue;
>>> @@ -239,7 +240,9 @@ computeFunctionSummary(ModuleSummaryInde
>>> // to record the call edge to the alias in that case. Eventually
>>> // an alias summary will be created to associate the alias and
>>> // aliasee.
>>> - CallGraphEdges[cast<GlobalValue>(CalledValue)].
>>> updateHotness(Hotness);
>>> + CallGraphEdges[Index.getOrInsertValueInfo(
>>> + cast<GlobalValue>(CalledValue))]
>>> + .updateHotness(Hotness);
>>> } else {
>>> // Skip inline assembly calls.
>>> if (CI && CI->isInlineAsm())
>>> @@ -254,15 +257,16 @@ computeFunctionSummary(ModuleSummaryInde
>>> ICallAnalysis.getPromotionCandidatesForInstruction(
>>> &I, NumVals, TotalCount, NumCandidates);
>>> for (auto &Candidate : CandidateProfileData)
>>> - CallGraphEdges[Candidate.Value].updateHotness(
>>> - getHotness(Candidate.Count, PSI));
>>> + CallGraphEdges[Index.getOrInsertValueInfo(Candidate.Value)]
>>> + .updateHotness(getHotness(Candidate.Count, PSI));
>>> }
>>> }
>>>
>>> // Explicit add hot edges to enforce importing for designated GUIDs
>>> for
>>> // sample PGO, to enable the same inlines as the profiled optimized
>>> binary.
>>> for (auto &I : F.getImportGUIDs())
>>> - CallGraphEdges[I].updateHotness(CalleeInfo::HotnessType::Hot);
>>> + CallGraphEdges[Index.getOrInsertValueInfo(I)].updateHotness(
>>> + CalleeInfo::HotnessType::Hot);
>>>
>>> bool NonRenamableLocal = isNonRenamableLocal(F);
>>> bool NotEligibleForImport =
>>> @@ -288,7 +292,7 @@ computeVariableSummary(ModuleSummaryInde
>>> DenseSet<GlobalValue::GUID> &CantBePromoted) {
>>> SetVector<ValueInfo> RefEdges;
>>> SmallPtrSet<const User *, 8> Visited;
>>> - findRefEdges(&V, RefEdges, Visited);
>>> + findRefEdges(Index, &V, RefEdges, Visited);
>>> bool NonRenamableLocal = isNonRenamableLocal(V);
>>> GlobalValueSummary::GVFlags Flags(V.getLinkage(), NonRenamableLocal,
>>> /* LiveRoot = */ false);
>>> @@ -317,12 +321,9 @@ computeAliasSummary(ModuleSummaryIndex &
>>>
>>> // Set LiveRoot flag on entries matching the given value name.
>>> static void setLiveRoot(ModuleSummaryIndex &Index, StringRef Name) {
>>> - auto SummaryList =
>>> - Index.findGlobalValueSummaryList(GlobalValue::getGUID(Name));
>>> - if (SummaryList == Index.end())
>>> - return;
>>> - for (auto &Summary : SummaryList->second)
>>> - Summary->setLiveRoot();
>>> + if (ValueInfo VI = Index.getValueInfo(GlobalValue::getGUID(Name)))
>>> + for (auto &Summary : VI.getSummaryList())
>>> + Summary->setLiveRoot();
>>> }
>>>
>>> ModuleSummaryIndex llvm::buildModuleSummaryIndex(
>>> @@ -446,12 +447,16 @@ ModuleSummaryIndex llvm::buildModuleSumm
>>> }
>>>
>>> for (auto &GlobalList : Index) {
>>> - assert(GlobalList.second.size() == 1 &&
>>> + // Ignore entries for references that are undefined in the current
>>> module.
>>> + if (GlobalList.second.SummaryList.empty())
>>> + continue;
>>> +
>>> + assert(GlobalList.second.SummaryList.size() == 1 &&
>>> "Expected module's index to have one summary per GUID");
>>> - auto &Summary = GlobalList.second[0];
>>> + auto &Summary = GlobalList.second.SummaryList[0];
>>> bool AllRefsCanBeExternallyReferenced =
>>> llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
>>> - return !CantBePromoted.count(VI.getValue()->getGUID());
>>> + return !CantBePromoted.count(VI.getGUID());
>>> });
>>> if (!AllRefsCanBeExternallyReferenced) {
>>> Summary->setNotEligibleToImport();
>>> @@ -461,9 +466,7 @@ ModuleSummaryIndex llvm::buildModuleSumm
>>> if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get())) {
>>> bool AllCallsCanBeExternallyReferenced = llvm::all_of(
>>> FuncSummary->calls(), [&](const FunctionSummary::EdgeTy
>>> &Edge) {
>>> - auto GUID = Edge.first.isGUID() ? Edge.first.getGUID()
>>> - : Edge.first.getValue()->
>>> getGUID();
>>> - return !CantBePromoted.count(GUID);
>>> + return !CantBePromoted.count(Edge.first.getGUID());
>>> });
>>> if (!AllCallsCanBeExternallyReferenced)
>>> Summary->setNotEligibleToImport();
>>>
>>> Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
>>> Bitcode/Reader/BitcodeReader.cpp?rev=302108&r1=302107&r2=
>>> 302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
>>> +++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Wed May 3 22:36:16
>>> 2017
>>> @@ -694,15 +694,16 @@ class ModuleSummaryIndexBitcodeReader :
>>> /// Used to enable on-demand parsing of the VST.
>>> uint64_t VSTOffset = 0;
>>>
>>> - // Map to save ValueId to GUID association that was recorded in the
>>> + // Map to save ValueId to ValueInfo association that was recorded in
>>> the
>>> // ValueSymbolTable. It is used after the VST is parsed to convert
>>> // call graph edges read from the function summary from referencing
>>> - // callees by their ValueId to using the GUID instead, which is how
>>> + // callees by their ValueId to using the ValueInfo instead, which is
>>> how
>>> // they are recorded in the summary index being built.
>>> - // We save a second GUID which is the same as the first one, but
>>> ignoring the
>>> - // linkage, i.e. for value other than local linkage they are
>>> identical.
>>> - DenseMap<unsigned, std::pair<GlobalValue::GUID, GlobalValue::GUID>>
>>> - ValueIdToCallGraphGUIDMap;
>>> + // We save a GUID which refers to the same global as the ValueInfo,
>>> but
>>> + // ignoring the linkage, i.e. for values other than local linkage
>>> they are
>>> + // identical.
>>> + DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
>>> + ValueIdToValueInfoMap;
>>>
>>> /// Map populated during module path string table parsing, from the
>>> /// module ID to a string reference owned by the index's module
>>> @@ -742,8 +743,8 @@ private:
>>> Error parseEntireSummary();
>>> Error parseModuleStringTable();
>>>
>>> - std::pair<GlobalValue::GUID, GlobalValue::GUID>
>>> - getGUIDFromValueId(unsigned ValueId);
>>> + std::pair<ValueInfo, GlobalValue::GUID>
>>> + getValueInfoFromValueId(unsigned ValueId);
>>>
>>> ModulePathStringTableTy::iterator addThisModulePath();
>>> };
>>> @@ -4697,11 +4698,11 @@ ModuleSummaryIndexBitcodeReader::addThis
>>> return TheIndex.addModulePath(ModulePath, ModuleId);
>>> }
>>>
>>> -std::pair<GlobalValue::GUID, GlobalValue::GUID>
>>> -ModuleSummaryIndexBitcodeReader::getGUIDFromValueId(unsigned ValueId) {
>>> - auto VGI = ValueIdToCallGraphGUIDMap.find(ValueId);
>>> - assert(VGI != ValueIdToCallGraphGUIDMap.end());
>>> - return VGI->second;
>>> +std::pair<ValueInfo, GlobalValue::GUID>
>>> +ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(unsigned
>>> ValueId) {
>>> + auto VGI = ValueIdToValueInfoMap[ValueId];
>>> + assert(VGI.first);
>>> + return VGI;
>>> }
>>>
>>> void ModuleSummaryIndexBitcodeReader::setValueGUID(
>>> @@ -4716,8 +4717,8 @@ void ModuleSummaryIndexBitcodeReader::se
>>> if (PrintSummaryGUIDs)
>>> dbgs() << "GUID " << ValueGUID << "(" << OriginalNameID << ") is "
>>> << ValueName << "\n";
>>> - ValueIdToCallGraphGUIDMap[ValueID] =
>>> - std::make_pair(ValueGUID, OriginalNameID);
>>> + ValueIdToValueInfoMap[ValueID] =
>>> + std::make_pair(TheIndex.getOrInsertValueInfo(ValueGUID),
>>> OriginalNameID);
>>> }
>>>
>>> // Specialized value symbol table parser used when reading module index
>>> @@ -4795,7 +4796,8 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> GlobalValue::GUID RefGUID = Record[1];
>>> // The "original name", which is the second value of the pair
>>> will be
>>> // overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined
>>> index.
>>> - ValueIdToCallGraphGUIDMap[ValueID] = std::make_pair(RefGUID,
>>> RefGUID);
>>> + ValueIdToValueInfoMap[ValueID] =
>>> + std::make_pair(TheIndex.getOrInsertValueInfo(RefGUID),
>>> RefGUID);
>>> break;
>>> }
>>> }
>>> @@ -4940,7 +4942,7 @@ ModuleSummaryIndexBitcodeReader::makeRef
>>> std::vector<ValueInfo> Ret;
>>> Ret.reserve(Record.size());
>>> for (uint64_t RefValueId : Record)
>>> - Ret.push_back(getGUIDFromValueId(RefValueId).first);
>>> + Ret.push_back(getValueInfoFromValueId(RefValueId).first);
>>> return Ret;
>>> }
>>>
>>> @@ -4950,14 +4952,14 @@ std::vector<FunctionSummary::EdgeTy> Mod
>>> Ret.reserve(Record.size());
>>> for (unsigned I = 0, E = Record.size(); I != E; ++I) {
>>> CalleeInfo::HotnessType Hotness = CalleeInfo::HotnessType::Unknown;
>>> - GlobalValue::GUID CalleeGUID = getGUIDFromValueId(Record[I]).first;
>>> + ValueInfo Callee = getValueInfoFromValueId(Record[I]).first;
>>> if (IsOldProfileFormat) {
>>> I += 1; // Skip old callsitecount field
>>> if (HasProfile)
>>> I += 1; // Skip old profilecount field
>>> } else if (HasProfile)
>>> Hotness = static_cast<CalleeInfo::HotnessType>(Record[++I]);
>>> - Ret.push_back(FunctionSummary::EdgeTy{CalleeGUID,
>>> CalleeInfo{Hotness}});
>>> + Ret.push_back(FunctionSummary::EdgeTy{Callee,
>>> CalleeInfo{Hotness}});
>>> }
>>> return Ret;
>>> }
>>> @@ -5027,7 +5029,8 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> case bitc::FS_VALUE_GUID: { // [valueid, refguid]
>>> uint64_t ValueID = Record[0];
>>> GlobalValue::GUID RefGUID = Record[1];
>>> - ValueIdToCallGraphGUIDMap[ValueID] = std::make_pair(RefGUID,
>>> RefGUID);
>>> + ValueIdToValueInfoMap[ValueID] =
>>> + std::make_pair(TheIndex.getOrInsertValueInfo(RefGUID),
>>> RefGUID);
>>> break;
>>> }
>>> // FS_PERMODULE: [valueid, flags, instcount, numrefs, numrefs x
>>> valueid,
>>> @@ -5068,10 +5071,10 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> PendingTypeCheckedLoadVCalls.clear();
>>> PendingTypeTestAssumeConstVCalls.clear();
>>> PendingTypeCheckedLoadConstVCalls.clear();
>>> - auto GUID = getGUIDFromValueId(ValueID);
>>> + auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
>>> FS->setModulePath(addThisModulePath()->first());
>>> - FS->setOriginalName(GUID.second);
>>> - TheIndex.addGlobalValueSummary(GUID.first, std::move(FS));
>>> + FS->setOriginalName(VIAndOriginalGUID.second);
>>> + TheIndex.addGlobalValueSummary(VIAndOriginalGUID.first,
>>> std::move(FS));
>>> break;
>>> }
>>> // FS_ALIAS: [valueid, flags, valueid]
>>> @@ -5091,14 +5094,15 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> // ownership.
>>> AS->setModulePath(addThisModulePath()->first());
>>>
>>> - GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID).
>>> first;
>>> + GlobalValue::GUID AliaseeGUID =
>>> + getValueInfoFromValueId(AliaseeID).first.getGUID();
>>> auto AliaseeInModule =
>>> TheIndex.findSummaryInModule(AliaseeGUID, ModulePath);
>>> if (!AliaseeInModule)
>>> return error("Alias expects aliasee summary to be parsed");
>>> AS->setAliasee(AliaseeInModule);
>>>
>>> - auto GUID = getGUIDFromValueId(ValueID);
>>> + auto GUID = getValueInfoFromValueId(ValueID);
>>> AS->setOriginalName(GUID.second);
>>> TheIndex.addGlobalValueSummary(GUID.first, std::move(AS));
>>> break;
>>> @@ -5112,7 +5116,7 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> makeRefList(ArrayRef<uint64_t>(Record).slice(2));
>>> auto FS = llvm::make_unique<GlobalVarSummary>(Flags,
>>> std::move(Refs));
>>> FS->setModulePath(addThisModulePath()->first());
>>> - auto GUID = getGUIDFromValueId(ValueID);
>>> + auto GUID = getValueInfoFromValueId(ValueID);
>>> FS->setOriginalName(GUID.second);
>>> TheIndex.addGlobalValueSummary(GUID.first, std::move(FS));
>>> break;
>>> @@ -5139,7 +5143,7 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> std::vector<FunctionSummary::EdgeTy> Edges = makeCallList(
>>> ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
>>> IsOldProfileFormat, HasProfile);
>>> - GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
>>> + ValueInfo VI = getValueInfoFromValueId(ValueID).first;
>>> auto FS = llvm::make_unique<FunctionSummary>(
>>> Flags, InstCount, std::move(Refs), std::move(Edges),
>>> std::move(PendingTypeTests), std::move(
>>> PendingTypeTestAssumeVCalls),
>>> @@ -5152,9 +5156,9 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> PendingTypeTestAssumeConstVCalls.clear();
>>> PendingTypeCheckedLoadConstVCalls.clear();
>>> LastSeenSummary = FS.get();
>>> - LastSeenGUID = GUID;
>>> + LastSeenGUID = VI.getGUID();
>>> FS->setModulePath(ModuleIdMap[ModuleId]);
>>> - TheIndex.addGlobalValueSummary(GUID, std::move(FS));
>>> + TheIndex.addGlobalValueSummary(VI, std::move(FS));
>>> break;
>>> }
>>> // FS_COMBINED_ALIAS: [valueid, modid, flags, valueid]
>>> @@ -5170,16 +5174,17 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> LastSeenSummary = AS.get();
>>> AS->setModulePath(ModuleIdMap[ModuleId]);
>>>
>>> - auto AliaseeGUID = getGUIDFromValueId(AliaseeValueId).first;
>>> + auto AliaseeGUID =
>>> + getValueInfoFromValueId(AliaseeValueId).first.getGUID();
>>> auto AliaseeInModule =
>>> TheIndex.findSummaryInModule(AliaseeGUID, AS->modulePath());
>>> if (!AliaseeInModule)
>>> return error("Alias expects aliasee summary to be parsed");
>>> AS->setAliasee(AliaseeInModule);
>>>
>>> - GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
>>> - LastSeenGUID = GUID;
>>> - TheIndex.addGlobalValueSummary(GUID, std::move(AS));
>>> + ValueInfo VI = getValueInfoFromValueId(ValueID).first;
>>> + LastSeenGUID = VI.getGUID();
>>> + TheIndex.addGlobalValueSummary(VI, std::move(AS));
>>> break;
>>> }
>>> // FS_COMBINED_GLOBALVAR_INIT_REFS: [valueid, modid, flags, n x
>>> valueid]
>>> @@ -5193,9 +5198,9 @@ Error ModuleSummaryIndexBitcodeReader::p
>>> auto FS = llvm::make_unique<GlobalVarSummary>(Flags,
>>> std::move(Refs));
>>> LastSeenSummary = FS.get();
>>> FS->setModulePath(ModuleIdMap[ModuleId]);
>>> - GlobalValue::GUID GUID = getGUIDFromValueId(ValueID).first;
>>> - LastSeenGUID = GUID;
>>> - TheIndex.addGlobalValueSummary(GUID, std::move(FS));
>>> + ValueInfo VI = getValueInfoFromValueId(ValueID).first;
>>> + LastSeenGUID = VI.getGUID();
>>> + TheIndex.addGlobalValueSummary(VI, std::move(FS));
>>> break;
>>> }
>>> // FS_COMBINED_ORIGINAL_NAME: [original_name]
>>>
>>> Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
>>> Bitcode/Writer/BitcodeWriter.cpp?rev=302108&r1=302107&r2=
>>> 302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)
>>> +++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Wed May 3 22:36:16
>>> 2017
>>> @@ -156,14 +156,14 @@ public:
>>> return;
>>> for (const auto &GUIDSummaryLists : *Index)
>>> // Examine all summaries for this GUID.
>>> - for (auto &Summary : GUIDSummaryLists.second)
>>> + for (auto &Summary : GUIDSummaryLists.second.SummaryList)
>>> if (auto FS = dyn_cast<FunctionSummary>(Summary.get()))
>>> // For each call in the function summary, see if the call
>>> // is to a GUID (which means it is for an indirect call,
>>> // otherwise we would have a Value for it). If so, synthesize
>>> // a value id.
>>> for (auto &CallEdge : FS->calls())
>>> - if (CallEdge.first.isGUID())
>>> + if (!CallEdge.first.getValue())
>>> assignValueId(CallEdge.first.getGUID());
>>> }
>>>
>>> @@ -304,7 +304,7 @@ private:
>>> }
>>> // Helper to get the valueId for the type of value recorded in VI.
>>> unsigned getValueId(ValueInfo VI) {
>>> - if (VI.isGUID())
>>> + if (!VI.getValue())
>>> return getValueId(VI.getGUID());
>>> return VE.getValueID(VI.getValue());
>>> }
>>> @@ -358,7 +358,7 @@ public:
>>> Callback(Summary);
>>> } else {
>>> for (auto &Summaries : Index)
>>> - for (auto &Summary : Summaries.second)
>>> + for (auto &Summary : Summaries.second.SummaryList)
>>> Callback({Summaries.first, Summary.get()});
>>> }
>>> }
>>> @@ -3270,15 +3270,14 @@ void ModuleBitcodeWriter::writePerModule
>>> void ModuleBitcodeWriter::writeModuleLevelReferences(
>>> const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
>>> unsigned FSModRefsAbbrev) {
>>> - auto Summaries =
>>> - Index->findGlobalValueSummaryList(GlobalValue::getGUID(V.
>>> getName()));
>>> - if (Summaries == Index->end()) {
>>> + auto VI = Index->getValueInfo(GlobalValue::getGUID(V.getName()));
>>> + if (!VI || VI.getSummaryList().empty()) {
>>> // Only declarations should not have a summary (a declaration might
>>> however
>>> // have a summary if the def was in module level asm).
>>> assert(V.isDeclaration());
>>> return;
>>> }
>>> - auto *Summary = Summaries->second.front().get();
>>> + auto *Summary = VI.getSummaryList()[0].get();
>>> NameVals.push_back(VE.getValueID(&V));
>>> GlobalVarSummary *VS = cast<GlobalVarSummary>(Summary);
>>> NameVals.push_back(getEncodedGVSummaryFlags(VS->flags()));
>>> @@ -3367,15 +3366,14 @@ void ModuleBitcodeWriter::writePerModule
>>> if (!F.hasName())
>>> report_fatal_error("Unexpected anonymous function when writing
>>> summary");
>>>
>>> - auto Summaries =
>>> - Index->findGlobalValueSummaryList(GlobalValue::getGUID(F.
>>> getName()));
>>> - if (Summaries == Index->end()) {
>>> + ValueInfo VI = Index->getValueInfo(GlobalValue::getGUID(F.
>>> getName()));
>>> + if (!VI || VI.getSummaryList().empty()) {
>>> // Only declarations should not have a summary (a declaration
>>> might
>>> // however have a summary if the def was in module level asm).
>>> assert(F.isDeclaration());
>>> continue;
>>> }
>>> - auto *Summary = Summaries->second.front().get();
>>> + auto *Summary = VI.getSummaryList()[0].get();
>>> writePerModuleFunctionSummaryRecord(NameVals, Summary,
>>> VE.getValueID(&F),
>>> FSCallsAbbrev,
>>> FSCallsProfileAbbrev, F);
>>> }
>>>
>>> Modified: llvm/trunk/lib/IR/ModuleSummaryIndex.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
>>> ModuleSummaryIndex.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/IR/ModuleSummaryIndex.cpp (original)
>>> +++ llvm/trunk/lib/IR/ModuleSummaryIndex.cpp Wed May 3 22:36:16 2017
>>> @@ -22,7 +22,7 @@ void ModuleSummaryIndex::collectDefinedF
>>> StringRef ModulePath, GVSummaryMapTy &GVSummaryMap) const {
>>> for (auto &GlobalList : *this) {
>>> auto GUID = GlobalList.first;
>>> - for (auto &GlobSummary : GlobalList.second) {
>>> + for (auto &GlobSummary : GlobalList.second.SummaryList) {
>>> auto *Summary = dyn_cast_or_null<FunctionSummary>(GlobSummary.
>>> get());
>>> if (!Summary)
>>> // Ignore global variable, focus on functions
>>> @@ -40,7 +40,7 @@ void ModuleSummaryIndex::collectDefinedG
>>> StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries) const {
>>> for (auto &GlobalList : *this) {
>>> auto GUID = GlobalList.first;
>>> - for (auto &Summary : GlobalList.second) {
>>> + for (auto &Summary : GlobalList.second.SummaryList) {
>>> ModuleToDefinedGVSummaries[Summary->modulePath()][GUID] =
>>> Summary.get();
>>> }
>>> }
>>> @@ -49,10 +49,10 @@ void ModuleSummaryIndex::collectDefinedG
>>> GlobalValueSummary *
>>> ModuleSummaryIndex::getGlobalValueSummary(uint64_t ValueGUID,
>>> bool PerModuleIndex) const {
>>> - auto SummaryList = findGlobalValueSummaryList(ValueGUID);
>>> - assert(SummaryList != end() && "GlobalValue not found in index");
>>> - assert((!PerModuleIndex || SummaryList->second.size() == 1) &&
>>> + auto VI = getValueInfo(ValueGUID);
>>> + assert(VI && "GlobalValue not found in index");
>>> + assert((!PerModuleIndex || VI.getSummaryList().size() == 1) &&
>>> "Expected a single entry per global value in per-module
>>> index");
>>> - auto &Summary = SummaryList->second[0];
>>> + auto &Summary = VI.getSummaryList()[0];
>>> return Summary.get();
>>> }
>>>
>>> Modified: llvm/trunk/lib/LTO/LTO.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/
>>> LTO.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/LTO/LTO.cpp (original)
>>> +++ llvm/trunk/lib/LTO/LTO.cpp Wed May 3 22:36:16 2017
>>> @@ -274,13 +274,14 @@ void llvm::thinLTOResolveWeakForLinkerIn
>>> // when needed.
>>> DenseSet<GlobalValueSummary *> GlobalInvolvedWithAlias;
>>> for (auto &I : Index)
>>> - for (auto &S : I.second)
>>> + for (auto &S : I.second.SummaryList)
>>> if (auto AS = dyn_cast<AliasSummary>(S.get()))
>>> GlobalInvolvedWithAlias.insert(&AS->getAliasee());
>>>
>>> for (auto &I : Index)
>>> - thinLTOResolveWeakForLinkerGUID(I.second, I.first,
>>> GlobalInvolvedWithAlias,
>>> - isPrevailing, recordNewLinkage);
>>> + thinLTOResolveWeakForLinkerGUID(I.second.SummaryList, I.first,
>>> + GlobalInvolvedWithAlias,
>>> isPrevailing,
>>> + recordNewLinkage);
>>> }
>>>
>>> static void thinLTOInternalizeAndPromoteGUID(
>>> @@ -301,7 +302,7 @@ void llvm::thinLTOInternalizeAndPromoteI
>>> ModuleSummaryIndex &Index,
>>> function_ref<bool(StringRef, GlobalValue::GUID)> isExported) {
>>> for (auto &I : Index)
>>> - thinLTOInternalizeAndPromoteGUID(I.second, I.first, isExported);
>>> + thinLTOInternalizeAndPromoteGUID(I.second.SummaryList, I.first,
>>> isExported);
>>> }
>>>
>>> // Requires a destructor for std::vector<InputModule>.
>>>
>>> Modified: llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/
>>> ThinLTOCodeGenerator.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp (original)
>>> +++ llvm/trunk/lib/LTO/ThinLTOCodeGenerator.cpp Wed May 3 22:36:16 2017
>>> @@ -119,8 +119,9 @@ static void computePrevailingCopies(
>>> };
>>>
>>> for (auto &I : Index) {
>>> - if (HasMultipleCopies(I.second))
>>> - PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second);
>>> + if (HasMultipleCopies(I.second.SummaryList))
>>> + PrevailingCopy[I.first] =
>>> + getFirstDefinitionForLinker(I.second.SummaryList);
>>> }
>>> }
>>>
>>>
>>> Modified: llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
>>> Transforms/IPO/FunctionImport.cpp?rev=302108&r1=302107&r2=
>>> 302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/IPO/FunctionImport.cpp Wed May 3
>>> 22:36:16 2017
>>> @@ -117,7 +117,7 @@ namespace {
>>> /// - [insert you fancy metric here]
>>> static const GlobalValueSummary *
>>> selectCallee(const ModuleSummaryIndex &Index,
>>> - const GlobalValueSummaryList &CalleeSummaryList,
>>> + ArrayRef<std::unique_ptr<GlobalValueSummary>>
>>> CalleeSummaryList,
>>> unsigned Threshold, StringRef CallerModulePath) {
>>> auto It = llvm::find_if(
>>> CalleeSummaryList,
>>> @@ -168,19 +168,6 @@ selectCallee(const ModuleSummaryIndex &I
>>> return cast<GlobalValueSummary>(It->get());
>>> }
>>>
>>> -/// Return the summary for the function \p GUID that fits the \p
>>> Threshold, or
>>> -/// null if there's no match.
>>> -static const GlobalValueSummary *selectCallee(GlobalValue::GUID GUID,
>>> - unsigned Threshold,
>>> - const ModuleSummaryIndex
>>> &Index,
>>> - StringRef
>>> CallerModulePath) {
>>> - auto CalleeSummaryList = Index.findGlobalValueSummaryList(GUID);
>>> - if (CalleeSummaryList == Index.end())
>>> - return nullptr; // This function does not have a summary
>>> - return selectCallee(Index, CalleeSummaryList->second, Threshold,
>>> - CallerModulePath);
>>> -}
>>> -
>>> using EdgeInfo = std::tuple<const FunctionSummary *, unsigned /*
>>> Threshold */,
>>> GlobalValue::GUID>;
>>>
>>> @@ -194,19 +181,23 @@ static void computeImportForFunction(
>>> FunctionImporter::ImportMapTy &ImportList,
>>> StringMap<FunctionImporter::ExportSetTy> *ExportLists = nullptr) {
>>> for (auto &Edge : Summary.calls()) {
>>> - auto GUID = Edge.first.getGUID();
>>> - DEBUG(dbgs() << " edge -> " << GUID << " Threshold:" << Threshold
>>> << "\n");
>>> + ValueInfo VI = Edge.first;
>>> + DEBUG(dbgs() << " edge -> " << VI.getGUID() << " Threshold:" <<
>>> Threshold
>>> + << "\n");
>>>
>>> - if (Index.findGlobalValueSummaryList(GUID) == Index.end()) {
>>> + if (VI.getSummaryList().empty()) {
>>> // For SamplePGO, the indirect call targets for local functions
>>> will
>>> // have its original name annotated in profile. We try to find the
>>> // corresponding PGOFuncName as the GUID.
>>> - GUID = Index.getGUIDFromOriginalID(GUID);
>>> + auto GUID = Index.getGUIDFromOriginalID(VI.getGUID());
>>> if (GUID == 0)
>>> continue;
>>> + VI = Index.getValueInfo(GUID);
>>> + if (!VI)
>>> + continue;
>>> }
>>>
>>> - if (DefinedGVSummaries.count(GUID)) {
>>> + if (DefinedGVSummaries.count(VI.getGUID())) {
>>> DEBUG(dbgs() << "ignored! Target already in destination
>>> module.\n");
>>> continue;
>>> }
>>> @@ -222,8 +213,8 @@ static void computeImportForFunction(
>>> const auto NewThreshold =
>>> Threshold * GetBonusMultiplier(Edge.second.Hotness);
>>>
>>> - auto *CalleeSummary =
>>> - selectCallee(GUID, NewThreshold, Index, Summary.modulePath());
>>> + auto *CalleeSummary = selectCallee(Index, VI.getSummaryList(),
>>> NewThreshold,
>>> + Summary.modulePath());
>>> if (!CalleeSummary) {
>>> DEBUG(dbgs() << "ignored! No qualifying callee with summary
>>> found.\n");
>>> continue;
>>> @@ -255,7 +246,7 @@ static void computeImportForFunction(
>>> const auto AdjThreshold = GetAdjustedThreshold(Threshold,
>>> IsHotCallsite);
>>>
>>> auto ExportModulePath = ResolvedCalleeSummary->modulePath();
>>> - auto &ProcessedThreshold = ImportList[ExportModulePath][GUID];
>>> + auto &ProcessedThreshold = ImportList[ExportModulePath][
>>> VI.getGUID()];
>>> /// Since the traversal of the call graph is DFS, we can revisit a
>>> function
>>> /// a second time with a higher threshold. In this case, it is
>>> added back to
>>> /// the worklist with the new threshold.
>>> @@ -271,7 +262,7 @@ static void computeImportForFunction(
>>> // Make exports in the source module.
>>> if (ExportLists) {
>>> auto &ExportList = (*ExportLists)[ExportModulePath];
>>> - ExportList.insert(GUID);
>>> + ExportList.insert(VI.getGUID());
>>> if (!PreviouslyImported) {
>>> // This is the first time this function was exported from its
>>> source
>>> // module, so mark all functions and globals it references as
>>> exported
>>> @@ -291,7 +282,7 @@ static void computeImportForFunction(
>>> }
>>>
>>> // Insert the newly imported function to the worklist.
>>> - Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold, GUID);
>>> + Worklist.emplace_back(ResolvedCalleeSummary, AdjThreshold,
>>> VI.getGUID());
>>> }
>>> }
>>>
>>> @@ -431,57 +422,56 @@ DenseSet<GlobalValue::GUID> llvm::comput
>>> if (GUIDPreservedSymbols.empty())
>>> // Don't do anything when nothing is live, this is friendly with
>>> tests.
>>> return DenseSet<GlobalValue::GUID>();
>>> - DenseSet<GlobalValue::GUID> LiveSymbols = GUIDPreservedSymbols;
>>> - SmallVector<GlobalValue::GUID, 128> Worklist;
>>> - Worklist.reserve(LiveSymbols.size() * 2);
>>> - for (auto GUID : LiveSymbols) {
>>> - DEBUG(dbgs() << "Live root: " << GUID << "\n");
>>> - Worklist.push_back(GUID);
>>> + DenseSet<ValueInfo> LiveSymbols;
>>> + SmallVector<ValueInfo, 128> Worklist;
>>> + Worklist.reserve(GUIDPreservedSymbols.size() * 2);
>>> + for (auto GUID : GUIDPreservedSymbols) {
>>> + ValueInfo VI = Index.getValueInfo(GUID);
>>> + if (!VI)
>>> + continue;
>>> + DEBUG(dbgs() << "Live root: " << VI.getGUID() << "\n");
>>> + LiveSymbols.insert(VI);
>>> + Worklist.push_back(VI);
>>> }
>>> // Add values flagged in the index as live roots to the worklist.
>>> for (const auto &Entry : Index) {
>>> bool IsLiveRoot = llvm::any_of(
>>> - Entry.second,
>>> + Entry.second.SummaryList,
>>> [&](const std::unique_ptr<llvm::GlobalValueSummary> &Summary) {
>>> return Summary->liveRoot();
>>> });
>>> if (!IsLiveRoot)
>>> continue;
>>> DEBUG(dbgs() << "Live root (summary): " << Entry.first << "\n");
>>> - Worklist.push_back(Entry.first);
>>> + Worklist.push_back(ValueInfo(&Entry));
>>> }
>>>
>>> while (!Worklist.empty()) {
>>> - auto GUID = Worklist.pop_back_val();
>>> - auto It = Index.findGlobalValueSummaryList(GUID);
>>> - if (It == Index.end()) {
>>> - DEBUG(dbgs() << "Not in index: " << GUID << "\n");
>>> - continue;
>>> - }
>>> + auto VI = Worklist.pop_back_val();
>>>
>>> // FIXME: we should only make the prevailing copy live here
>>> - for (auto &Summary : It->second) {
>>> + for (auto &Summary : VI.getSummaryList()) {
>>> for (auto Ref : Summary->refs()) {
>>> - auto RefGUID = Ref.getGUID();
>>> - if (LiveSymbols.insert(RefGUID).second) {
>>> - DEBUG(dbgs() << "Marking live (ref): " << RefGUID << "\n");
>>> - Worklist.push_back(RefGUID);
>>> + if (LiveSymbols.insert(Ref).second) {
>>> + DEBUG(dbgs() << "Marking live (ref): " << Ref.getGUID() <<
>>> "\n");
>>> + Worklist.push_back(Ref);
>>> }
>>> }
>>> if (auto *FS = dyn_cast<FunctionSummary>(Summary.get())) {
>>> for (auto Call : FS->calls()) {
>>> - auto CallGUID = Call.first.getGUID();
>>> - if (LiveSymbols.insert(CallGUID).second) {
>>> - DEBUG(dbgs() << "Marking live (call): " << CallGUID <<
>>> "\n");
>>> - Worklist.push_back(CallGUID);
>>> + if (LiveSymbols.insert(Call.first).second) {
>>> + DEBUG(dbgs() << "Marking live (call): " <<
>>> Call.first.getGUID()
>>> + << "\n");
>>> + Worklist.push_back(Call.first);
>>> }
>>> }
>>> }
>>> if (auto *AS = dyn_cast<AliasSummary>(Summary.get())) {
>>> auto AliaseeGUID = AS->getAliasee().getOriginalName();
>>> - if (LiveSymbols.insert(AliaseeGUID).second) {
>>> + ValueInfo AliaseeVI = Index.getValueInfo(AliaseeGUID);
>>> + if (AliaseeVI && LiveSymbols.insert(AliaseeVI).second) {
>>> DEBUG(dbgs() << "Marking live (alias): " << AliaseeGUID <<
>>> "\n");
>>> - Worklist.push_back(AliaseeGUID);
>>> + Worklist.push_back(AliaseeVI);
>>> }
>>> }
>>> }
>>> @@ -490,10 +480,9 @@ DenseSet<GlobalValue::GUID> llvm::comput
>>> DeadSymbols.reserve(
>>> std::min(Index.size(), Index.size() - LiveSymbols.size()));
>>> for (auto &Entry : Index) {
>>> - auto GUID = Entry.first;
>>> - if (!LiveSymbols.count(GUID)) {
>>> - DEBUG(dbgs() << "Marking dead: " << GUID << "\n");
>>> - DeadSymbols.insert(GUID);
>>> + if (!LiveSymbols.count(ValueInfo(&Entry))) {
>>> + DEBUG(dbgs() << "Marking dead: " << Entry.first << "\n");
>>> + DeadSymbols.insert(Entry.first);
>>> }
>>> }
>>> DEBUG(dbgs() << LiveSymbols.size() << " symbols Live, and "
>>> @@ -825,7 +814,7 @@ static bool doImportingForModule(Module
>>> // is only enabled when testing importing via the 'opt' tool, which
>>> does
>>> // not do the ThinLink that would normally determine what values to
>>> promote.
>>> for (auto &I : *Index) {
>>> - for (auto &S : I.second) {
>>> + for (auto &S : I.second.SummaryList) {
>>> if (GlobalValue::isLocalLinkage(S->linkage()))
>>> S->setLinkage(GlobalValue::ExternalLinkage);
>>> }
>>>
>>> Modified: llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
>>> Transforms/IPO/LowerTypeTests.cpp?rev=302108&r1=302107&r2=
>>> 302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/IPO/LowerTypeTests.cpp Wed May 3
>>> 22:36:16 2017
>>> @@ -1440,7 +1440,7 @@ bool LowerTypeTestsModule::lower() {
>>> }
>>>
>>> for (auto &P : *ExportSummary) {
>>> - for (auto &S : P.second) {
>>> + for (auto &S : P.second.SummaryList) {
>>> auto *FS = dyn_cast<FunctionSummary>(S.get());
>>> if (!FS)
>>> continue;
>>>
>>> Modified: llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/
>>> WholeProgramDevirt.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp (original)
>>> +++ llvm/trunk/lib/Transforms/IPO/WholeProgramDevirt.cpp Wed May 3
>>> 22:36:16 2017
>>> @@ -1322,7 +1322,7 @@ bool DevirtModule::run() {
>>> }
>>>
>>> for (auto &P : *ExportSummary) {
>>> - for (auto &S : P.second) {
>>> + for (auto &S : P.second.SummaryList) {
>>> auto *FS = dyn_cast<FunctionSummary>(S.get());
>>> if (!FS)
>>> continue;
>>>
>>> Modified: llvm/trunk/tools/llvm-link/llvm-link.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
>>> link/llvm-link.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/tools/llvm-link/llvm-link.cpp (original)
>>> +++ llvm/trunk/tools/llvm-link/llvm-link.cpp Wed May 3 22:36:16 2017
>>> @@ -300,7 +300,7 @@ static bool linkFiles(const char *argv0,
>>> // does not do the ThinLink that would normally determine what
>>> values to
>>> // promote.
>>> for (auto &I : *Index) {
>>> - for (auto &S : I.second) {
>>> + for (auto &S : I.second.SummaryList) {
>>> if (GlobalValue::isLocalLinkage(S->linkage()))
>>> S->setLinkage(GlobalValue::ExternalLinkage);
>>> }
>>>
>>> Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-
>>> lto/llvm-lto.cpp?rev=302108&r1=302107&r2=302108&view=diff
>>> ============================================================
>>> ==================
>>> --- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)
>>> +++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Wed May 3 22:36:16 2017
>>> @@ -284,7 +284,7 @@ void printIndexStats() {
>>>
>>> unsigned Calls = 0, Refs = 0, Functions = 0, Alias = 0, Globals = 0;
>>> for (auto &Summaries : *Index) {
>>> - for (auto &Summary : Summaries.second) {
>>> + for (auto &Summary : Summaries.second.SummaryList) {
>>> Refs += Summary->refs().size();
>>> if (auto *FuncSummary = dyn_cast<FunctionSummary>(Summary.get()))
>>> {
>>> Functions++;
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
--
--
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170504/0fe2a08f/attachment-0001.html>
More information about the llvm-commits
mailing list