diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/IR/ModuleSummaryIndex.cpp | 244 | ||||
-rw-r--r-- | llvm/lib/LTO/LTO.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/LTO/LTOBackend.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/LTO/ThinLTOCodeGenerator.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/FunctionImport.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/LowerTypeTests.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp | 2 |
9 files changed, 10 insertions, 266 deletions
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp index cf2fe7776dd..efa5bd564ad 100644 --- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -372,7 +372,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex( std::function<BlockFrequencyInfo *(const Function &F)> GetBFICallback, ProfileSummaryInfo *PSI) { assert(PSI); - ModuleSummaryIndex Index(/*IsPerformingAnalysis=*/true); + ModuleSummaryIndex Index; // Identify the local values in the llvm.used and llvm.compiler.used sets, // which should not be exported as they would then require renaming and diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 7ffa6248879..1b029bf8885 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -4813,12 +4813,8 @@ void ModuleSummaryIndexBitcodeReader::setValueGUID( if (PrintSummaryGUIDs) dbgs() << "GUID " << ValueGUID << "(" << OriginalNameID << ") is " << ValueName << "\n"; - - // UseStrtab is false for legacy summary formats and value names are - // created on stack. We can't use them outside of parseValueSymbolTable. - ValueIdToValueInfoMap[ValueID] = std::make_pair( - TheIndex.getOrInsertValueInfo(ValueGUID, UseStrtab ? ValueName : ""), - OriginalNameID); + ValueIdToValueInfoMap[ValueID] = + std::make_pair(TheIndex.getOrInsertValueInfo(ValueGUID), OriginalNameID); } // Specialized value symbol table parser used when reading module index @@ -5683,8 +5679,7 @@ Expected<std::unique_ptr<ModuleSummaryIndex>> BitcodeModule::getSummary() { BitstreamCursor Stream(Buffer); Stream.JumpToBit(ModuleBit); - auto Index = - llvm::make_unique<ModuleSummaryIndex>(/*IsPerformingAnalysis=*/false); + auto Index = llvm::make_unique<ModuleSummaryIndex>(); ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index, ModuleIdentifier, 0); diff --git a/llvm/lib/IR/ModuleSummaryIndex.cpp b/llvm/lib/IR/ModuleSummaryIndex.cpp index a0b963e7af3..51c4bae3332 100644 --- a/llvm/lib/IR/ModuleSummaryIndex.cpp +++ b/llvm/lib/IR/ModuleSummaryIndex.cpp @@ -14,7 +14,6 @@ #include "llvm/IR/ModuleSummaryIndex.h" #include "llvm/ADT/StringMap.h" -#include "llvm/Support/Path.h" using namespace llvm; // Collect for the given module the list of function it defines @@ -70,246 +69,3 @@ bool ModuleSummaryIndex::isGUIDLive(GlobalValue::GUID GUID) const { return true; return false; } - -namespace { -struct Attributes { - void add(const Twine &Name, const Twine &Value, - const Twine &Comment = Twine()); - std::string getAsString() const; - - std::vector<std::string> Attrs; - std::string Comments; -}; - -struct Edge { - uint64_t SrcMod; - int Hotness; - GlobalValue::GUID Src; - GlobalValue::GUID Dst; -}; -} - -void Attributes::add(const Twine &Name, const Twine &Value, - const Twine &Comment) { - std::string A = Name.str(); - A += "=\""; - A += Value.str(); - A += "\""; - Attrs.push_back(A); - if (!Comment.isTriviallyEmpty()) { - if (Comments.empty()) - Comments = " // "; - else - Comments += ", "; - Comments += Comment.str(); - } -} - -std::string Attributes::getAsString() const { - if (Attrs.empty()) - return ""; - - std::string Ret = "["; - for (auto &A : Attrs) - Ret += A + ","; - Ret.pop_back(); - Ret += "];"; - Ret += Comments; - return Ret; -} - -static std::string linkageToString(GlobalValue::LinkageTypes LT) { - switch (LT) { - case GlobalValue::ExternalLinkage: - return "extern"; - case GlobalValue::AvailableExternallyLinkage: - return "av_ext"; - case GlobalValue::LinkOnceAnyLinkage: - return "linkonce"; - case GlobalValue::LinkOnceODRLinkage: - return "linkonce_odr"; - case GlobalValue::WeakAnyLinkage: - return "weak"; - case GlobalValue::WeakODRLinkage: - return "weak_odr"; - case GlobalValue::AppendingLinkage: - return "appending"; - case GlobalValue::InternalLinkage: - return "internal"; - case GlobalValue::PrivateLinkage: - return "private"; - case GlobalValue::ExternalWeakLinkage: - return "extern_weak"; - case GlobalValue::CommonLinkage: - return "common"; - } - - return "<unknown>"; -} - -static std::string fflagsToString(FunctionSummary::FFlags F) { - auto FlagValue = [](unsigned V) { return V ? '1' : '0'; }; - char FlagRep[] = {FlagValue(F.ReadNone), FlagValue(F.ReadOnly), - FlagValue(F.NoRecurse), FlagValue(F.ReturnDoesNotAlias), 0}; - - return FlagRep; -} - -// Get string representation of function instruction count and flags. -static std::string getSummaryAttributes(GlobalValueSummary* GVS) { - auto *FS = dyn_cast_or_null<FunctionSummary>(GVS); - if (!FS) - return ""; - - return std::string("inst: ") + std::to_string(FS->instCount()) + - ", ffl: " + fflagsToString(FS->fflags()); -} - -static std::string getNodeVisualName(const ValueInfo &VI) { - return VI.name().empty() ? std::string("@") + std::to_string(VI.getGUID()) - : VI.name().str(); -} - -static std::string getNodeLabel(const ValueInfo &VI, GlobalValueSummary *GVS) { - if (isa<AliasSummary>(GVS)) - return getNodeVisualName(VI); - - std::string Attrs = getSummaryAttributes(GVS); - std::string Label = - getNodeVisualName(VI) + "|" + linkageToString(GVS->linkage()); - if (!Attrs.empty()) - Label += std::string(" (") + Attrs + ")"; - Label += "}"; - - return Label; -} - -// Write definition of external node, which doesn't have any -// specific module associated with it. Typically this is function -// or variable defined in native object or library. -static void defineExternalNode(raw_ostream &OS, const char *Pfx, - const ValueInfo &VI) { - auto StrId = std::to_string(VI.getGUID()); - OS << " " << StrId << " [label=\"" << getNodeVisualName(VI) - << "\"]; // defined externally\n"; -} - -void ModuleSummaryIndex::exportToDot(raw_ostream& OS) const { - std::vector<Edge> CrossModuleEdges; - DenseMap<GlobalValue::GUID, std::vector<uint64_t>> NodeMap; - StringMap<GVSummaryMapTy> ModuleToDefinedGVS; - collectDefinedGVSummariesPerModule(ModuleToDefinedGVS); - - // Get node identifier in form MXXX_<GUID>. The MXXX prefix is required, - // because we may have multiple linkonce functions summaries. - auto NodeId = [](uint64_t ModId, GlobalValue::GUID Id) { - return ModId == (uint64_t)-1 ? std::to_string(Id) - : std::string("M") + std::to_string(ModId) + - "_" + std::to_string(Id); - }; - - auto DrawEdge = [&](const char *Pfx, int SrcMod, GlobalValue::GUID SrcId, - int DstMod, GlobalValue::GUID DstId, int TypeOrHotness) { - // 0 corresponds to alias edge, 1 to ref edge, 2 to call with unknown - // hotness, ... - TypeOrHotness += 2; - static const char *EdgeAttrs[] = { - " [style=dotted]; // alias", - " [style=dashed]; // ref", - " // call (hotness : Unknown)", - " [color=blue]; // call (hotness : Cold)", - " // call (hotness : None)", - " [color=brown]; // call (hotness : Hot)", - " [style=bold,color=red]; // call (hotness : Critical)"}; - - assert(static_cast<size_t>(TypeOrHotness) < - sizeof(EdgeAttrs) / sizeof(EdgeAttrs[0])); - OS << Pfx << NodeId(SrcMod, SrcId) << " -> " << NodeId(DstMod, DstId) - << EdgeAttrs[TypeOrHotness] << "\n"; - }; - - OS << "digraph Summary {\n"; - for (auto &ModIt : ModuleToDefinedGVS) { - auto ModId = getModuleId(ModIt.first()); - OS << " // Module: " << ModIt.first() << "\n"; - OS << " subgraph cluster_" << std::to_string(ModId) << " {\n"; - OS << " style = filled;\n"; - OS << " color = lightgrey;\n"; - OS << " label = \"" << sys::path::filename(ModIt.first()) << "\";\n"; - OS << " node [style=filled,fillcolor=lightblue];\n"; - - auto &GVSMap = ModIt.second; - auto Draw = [&](GlobalValue::GUID IdFrom, GlobalValue::GUID IdTo, int Hotness) { - if (!GVSMap.count(IdTo)) { - CrossModuleEdges.push_back({ModId, Hotness, IdFrom, IdTo}); - return; - } - DrawEdge(" ", ModId, IdFrom, ModId, IdTo, Hotness); - }; - - for (auto &SummaryIt : GVSMap) { - NodeMap[SummaryIt.first].push_back(ModId); - auto Flags = SummaryIt.second->flags(); - Attributes A; - if (isa<FunctionSummary>(SummaryIt.second)) { - A.add("shape", "record", "function"); - } else if (isa<AliasSummary>(SummaryIt.second)) { - A.add("style", "dotted,filled", "alias"); - A.add("shape", "box"); - } else { - A.add("shape", "Mrecord", "variable"); - } - - auto VI = getValueInfo(SummaryIt.first); - A.add("label", getNodeLabel(VI, SummaryIt.second)); - if (!Flags.Live) - A.add("fillcolor", "red", "dead"); - else if (Flags.NotEligibleToImport) - A.add("fillcolor", "yellow", "not eligible to import"); - - OS << " " << NodeId(ModId, SummaryIt.first) << " " << A.getAsString() - << "\n"; - } - OS << " // Edges:\n"; - - for (auto &SummaryIt : GVSMap) { - auto *GVS = SummaryIt.second; - for (auto &R : GVS->refs()) - Draw(SummaryIt.first, R.getGUID(), -1); - - if (auto *AS = dyn_cast_or_null<AliasSummary>(SummaryIt.second)) { - auto AliaseeOrigId = AS->getAliasee().getOriginalName(); - auto AliaseeId = getGUIDFromOriginalID(AliaseeOrigId); - - Draw(SummaryIt.first, AliaseeId ? AliaseeId : AliaseeOrigId, -2); - continue; - } - - if (auto *FS = dyn_cast_or_null<FunctionSummary>(SummaryIt.second)) - for (auto &CGEdge : FS->calls()) - Draw(SummaryIt.first, CGEdge.first.getGUID(), - static_cast<int>(CGEdge.second.Hotness)); - } - OS << " }\n"; - } - - for (auto &E : CrossModuleEdges) { - auto &ModList = NodeMap[E.Dst]; - if (ModList.empty()) { - defineExternalNode(OS, " ", getValueInfo(E.Dst)); - // Add fake module to the list to draw an edge to an external node - // in the loop below. - ModList.push_back(-1); - } - for (auto DstMod : ModList) - // The edge representing call or ref is drawn to every module where target - // symbol is defined. When target is a linkonce symbol there can be - // multiple edges representing a single call or ref, both intra-module and - // cross-module. As we've already drawn all intra-module edges before we - // skip it here. - if (DstMod != E.SrcMod) - DrawEdge(" ", E.SrcMod, E.Src, DstMod, E.Dst, E.Hotness); - } - - OS << "}"; -} diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp index 69d46a594d3..a36d640ba9e 100644 --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -388,8 +388,7 @@ LTO::RegularLTOState::RegularLTOState(unsigned ParallelCodeGenParallelismLevel, Ctx(Conf), CombinedModule(llvm::make_unique<Module>("ld-temp.o", Ctx)), Mover(llvm::make_unique<IRMover>(*CombinedModule)) {} -LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) - : Backend(Backend), CombinedIndex(/*IsPeformingAnalysis*/ false) { +LTO::ThinLTOState::ThinLTOState(ThinBackend Backend) : Backend(Backend) { if (!Backend) this->Backend = createInProcessThinBackend(llvm::heavyweight_hardware_concurrency()); diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index 07053267750..501d6284117 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -103,12 +103,6 @@ Error Config::addSaveTemps(std::string OutputFileName, if (EC) reportOpenError(Path, EC.message()); WriteIndexToFile(Index, OS); - - Path = OutputFileName + "index.dot"; - raw_fd_ostream OSDot(Path, EC, sys::fs::OpenFlags::F_None); - if (EC) - reportOpenError(Path, EC.message()); - Index.exportToDot(OSDot); return true; }; diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp index b5ac5a77e9c..692396eac20 100644 --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -592,7 +592,7 @@ std::unique_ptr<TargetMachine> TargetMachineBuilder::create() const { */ std::unique_ptr<ModuleSummaryIndex> ThinLTOCodeGenerator::linkCombinedIndex() { std::unique_ptr<ModuleSummaryIndex> CombinedIndex = - llvm::make_unique<ModuleSummaryIndex>(/*IsPeformingAnalysis=*/false); + llvm::make_unique<ModuleSummaryIndex>(); uint64_t NextModuleId = 0; for (auto &ModuleBuffer : Modules) { if (Error Err = readModuleSummaryIndex(ModuleBuffer.getMemBuffer(), diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp index b1eefb96454..b6d6201cd23 100644 --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -231,7 +231,7 @@ updateValueInfoForIndirectCalls(const ModuleSummaryIndex &Index, ValueInfo VI) { // it, rather than needing to perform this mapping on each walk. auto GUID = Index.getGUIDFromOriginalID(VI.getGUID()); if (GUID == 0) - return ValueInfo(); + return nullptr; return Index.getValueInfo(GUID); } @@ -517,7 +517,7 @@ void llvm::computeDeadSymbols( for (auto &S : Entry.second.SummaryList) if (S->isLive()) { DEBUG(dbgs() << "Live root: " << Entry.first << "\n"); - Worklist.push_back(ValueInfo(/*IsAnalysis=*/false, &Entry)); + Worklist.push_back(ValueInfo(&Entry)); ++LiveSymbols; break; } diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 5dd9fd35e30..20f54ef53f7 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1529,7 +1529,7 @@ LowerTypeTestsModule::LowerTypeTestsModule( } bool LowerTypeTestsModule::runForTesting(Module &M) { - ModuleSummaryIndex Summary(/*IsPerformingAnalysis=*/false); + ModuleSummaryIndex Summary; // Handle the command-line summary arguments. This code is for testing // purposes only, so we handle errors directly. diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index aa1755bb097..8c7eb48f2ff 100644 --- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -584,7 +584,7 @@ PreservedAnalyses WholeProgramDevirtPass::run(Module &M, bool DevirtModule::runForTesting( Module &M, function_ref<AAResults &(Function &)> AARGetter, function_ref<OptimizationRemarkEmitter &(Function *)> OREGetter) { - ModuleSummaryIndex Summary(/*IsPerformingAnalysis=*/false); + ModuleSummaryIndex Summary; // Handle the command-line summary arguments. This code is for testing // purposes only, so we handle errors directly. |