LLVM: lib/Transforms/IPO/FunctionImport.cpp File Reference (original) (raw)
Go to the source code of this file.
| Classes | |
|---|---|
| class | GlobalsImporter |
| Import globals referenced by a function or other globals that are being imported, if importing such global is possible. More... | |
| class | ModuleImportsManager |
| Determine the list of imports and exports for each module. More... | |
| class | WorkloadImportsManager |
| A ModuleImportsManager that operates based on a workload definition (see -thinlto-workload-def). More... | |
| struct | ImportStatistics |
| Namespaces | |
|---|---|
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. |
| Macros | |
|---|---|
| #define | DEBUG_TYPE "function-import" |
| Functions | |
|---|---|
| STATISTIC (NumImportedFunctionsThinLink, "Number of functions thin link decided to import") | |
| STATISTIC (NumImportedHotFunctionsThinLink, "Number of hot functions thin link decided to import") | |
| STATISTIC (NumImportedCriticalFunctionsThinLink, "Number of critical functions thin link decided to import") | |
| STATISTIC (NumImportedGlobalVarsThinLink, "Number of global variables thin link decided to import") | |
| STATISTIC (NumImportedFunctions, "Number of functions imported in backend") | |
| STATISTIC (NumImportedGlobalVars, "Number of global variables imported in backend") | |
| STATISTIC (NumImportedModules, "Number of modules imported from") | |
| STATISTIC (NumDeadSymbols, "Number of dead stripped symbols in index") | |
| STATISTIC (NumLiveSymbols, "Number of live symbols in index") | |
| cl::opt< bool > | llvm::ForceImportAll ("force-import-all", cl::init(false), cl::Hidden, cl::desc("Import functions with noinline attribute")) |
| static std::unique_ptr< Module > | loadFile (const std::string &FileName, LLVMContext &Context) |
| static bool | shouldSkipLocalInAnotherModule (const GlobalValueSummary *RefSummary, size_t NumDefs, StringRef ImporterModule) |
| static auto | qualifyCalleeCandidates (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary > > CalleeSummaryList, StringRef CallerModulePath) |
| Given a list of possible callee implementation for a call site, qualify the legality of importing each. | |
| static const GlobalValueSummary * | selectCallee (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary > > CalleeSummaryList, unsigned Threshold, StringRef CallerModulePath, const GlobalValueSummary *&TooLargeOrNoInlineSummary, FunctionImporter::ImportFailureReason &Reason) |
| Given a list of possible callee implementation for a call site, select one that fits the Threshold for function definition import. | |
| static const char * | getFailureName (FunctionImporter::ImportFailureReason Reason) |
| static bool | isGlobalVarSummary (const ModuleSummaryIndex &Index, ValueInfo VI) |
| static bool | isGlobalVarSummary (const ModuleSummaryIndex &Index, GlobalValue::GUID G) |
| static unsigned | numGlobalVarSummaries (const ModuleSummaryIndex &Index, FunctionImporter::ExportSetTy &ExportSet) |
| static DenseMap< StringRef, ImportStatistics > | collectImportStatistics (const ModuleSummaryIndex &Index, const FunctionImporter::ImportMapTy &ImportList) |
| static bool | checkVariableImport (const ModuleSummaryIndex &Index, FunctionImporter::ImportListsTy &ImportLists, DenseMap< StringRef, FunctionImporter::ExportSetTy > &ExportLists) |
| static void | dumpImportListForModule (const ModuleSummaryIndex &Index, StringRef ModulePath, FunctionImporter::ImportMapTy &ImportList) |
| static void | ComputeCrossModuleImportForModuleForTest (StringRef ModulePath, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing, const ModuleSummaryIndex &Index, FunctionImporter::ImportMapTy &ImportList) |
| Compute all the imports for the given module using the Index. | |
| static void | ComputeCrossModuleImportForModuleFromIndexForTest (StringRef ModulePath, const ModuleSummaryIndex &Index, FunctionImporter::ImportMapTy &ImportList) |
| Mark all external summaries in Index for import into the given module. | |
| void | updateValueInfoForIndirectCalls (ModuleSummaryIndex &Index, FunctionSummary *FS) |
| static Function * | replaceAliasWithAliasee (Module *SrcModule, GlobalAlias *GA) |
| Make alias a clone of its aliasee. | |
| static void | internalizeGVsAfterImport (Module &M) |
| static bool | doImportingForModuleForTest (Module &M, function_ref< bool(GlobalValue::GUID, const GlobalValueSummary *)> isPrevailing) |
| Variables | |
|---|---|
| static cl::opt< unsigned > | llvm::ImportInstrLimit ("import-instr-limit", cl::init(100), cl::Hidden, cl::value_desc("N"), cl::desc("Only import functions with less than N instructions")) |
| Limit on instruction count of imported functions. | |
| static cl::opt< int > | llvm::ImportCutoff ("import-cutoff", cl::init(-1), cl::Hidden, cl::value_desc("N"), cl::desc("Only import first N functions if N>=0 (default -1)")) |
| static cl::opt< float > | llvm::ImportInstrFactor ("import-instr-evolution-factor", cl::init(0.7), cl::Hidden, cl::value_desc("x"), cl::desc("As we import functions, multiply the " "`import-instr-limit` threshold by this factor " "before processing newly imported functions")) |
| static cl::opt< float > | llvm::ImportHotInstrFactor ("import-hot-evolution-factor", cl::init(1.0), cl::Hidden, cl::value_desc("x"), cl::desc("As we import functions called from hot callsite, multiply the " "`import-instr-limit` threshold by this factor " "before processing newly imported functions")) |
| static cl::opt< float > | llvm::ImportHotMultiplier ("import-hot-multiplier", cl::init(10.0), cl::Hidden, cl::value_desc("x"), cl::desc("Multiply the `import-instr-limit` threshold for hot callsites")) |
| static cl::opt< float > | llvm::ImportCriticalMultiplier ("import-critical-multiplier", cl::init(100.0), cl::Hidden, cl::value_desc("x"), cl::desc("Multiply the `import-instr-limit` threshold for critical callsites")) |
| static cl::opt< float > | llvm::ImportColdMultiplier ("import-cold-multiplier", cl::init(0), cl::Hidden, cl::value_desc("N"), cl::desc("Multiply the `import-instr-limit` threshold for cold callsites")) |
| static cl::opt< bool > | llvm::PrintImports ("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions")) |
| static cl::opt< bool > | llvm::PrintImportFailures ("print-import-failures", cl::init(false), cl::Hidden, cl::desc("Print information for functions rejected for importing")) |
| static cl::opt< bool > | llvm::ComputeDead ("compute-dead", cl::init(true), cl::Hidden, cl::desc("Compute dead symbols")) |
| static cl::opt< bool > | llvm::EnableImportMetadata ("enable-import-metadata", cl::init(false), cl::Hidden, cl::desc("Enable import metadata like 'thinlto_src_module' and " "'thinlto_src_file'")) |
| static cl::opt< std::string > | llvm::SummaryFile ("summary-file", cl::desc("The summary file to use for function importing.")) |
| Summary file to use for function importing when using -function-import from the command line. | |
| static cl::opt< bool > | llvm::ImportAllIndex ("import-all-index", cl::desc("Import all external functions in index.")) |
| Used when testing importing from distributed indexes via opt. | |
| static cl::opt< bool > | llvm::ImportDeclaration ("import-declaration", cl::init(false), cl::Hidden, cl::desc("If true, import function declaration as fallback if the function " "definition is not imported.")) |
| This is a test-only option. | |
| static cl::opt< std::string > | llvm::WorkloadDefinitions ("thinlto-workload-def", cl::desc("Pass a workload definition. This is a file containing a JSON " "dictionary. The keys are root functions, the values are lists of " "functions to import in the module defining the root. It is " "assumed -funique-internal-linkage-names was used, to ensure " "local linkage functions have unique names. For example: \n" "{\n" " \"rootFunction_1\": [\"function_to_import_1\", " "\"function_to_import_2\"], \n" " \"rootFunction_2\": [\"function_to_import_3\", " "\"function_to_import_4\"] \n" "}"), cl::Hidden) |
| Pass a workload description file - an example of workload would be the functions executed to satisfy a RPC request. | |
| static cl::opt< bool > | llvm::CtxprofMoveRootsToOwnModule ("thinlto-move-ctxprof-trees", cl::desc("Move contextual profiling roots and the graphs under them in " "their own module."), cl::Hidden, cl::init(false)) |
| cl::list< GlobalValue::GUID > | llvm::MoveSymbolGUID |
◆ DEBUG_TYPE
#define DEBUG_TYPE "function-import"
◆ checkVariableImport()
◆ collectImportStatistics()
◆ ComputeCrossModuleImportForModuleForTest()
◆ ComputeCrossModuleImportForModuleFromIndexForTest()
◆ doImportingForModuleForTest()
Definition at line 2065 of file FunctionImport.cpp.
References ComputeCrossModuleImportForModuleForTest(), ComputeCrossModuleImportForModuleFromIndexForTest(), llvm::errs(), llvm::GlobalValue::ExternalLinkage, llvm::getModuleSummaryIndexForFile(), I, llvm::ImportAllIndex, llvm::FunctionImporter::importFunctions(), llvm::GlobalValue::isLocalLinkage(), loadFile(), llvm::logAllUnhandledErrors(), llvm::renameModuleForThinLTO(), llvm::report_fatal_error(), llvm::SummaryFile, and llvm::Expected< T >::takeError().
Referenced by llvm::FunctionImportPass::run().
◆ dumpImportListForModule()
◆ getFailureName()
◆ internalizeGVsAfterImport()
| void internalizeGVsAfterImport ( Module & M) | static |
|---|
◆ isGlobalVarSummary() [1/2]
◆ isGlobalVarSummary() [2/2]
◆ loadFile()
◆ numGlobalVarSummaries()
◆ qualifyCalleeCandidates()
Given a list of possible callee implementation for a call site, qualify the legality of importing each.
The return is a range of pairs. Each pair corresponds to a candidate. The first value is the ImportFailureReason for that candidate, the second is the candidate.
Definition at line 230 of file FunctionImport.cpp.
References llvm::dyn_cast(), llvm::FunctionImporter::GlobalVar, llvm::FunctionImporter::InterposableLinkage, llvm::GlobalValue::isInterposableLinkage(), llvm::FunctionImporter::LocalLinkageNotInModule, llvm::map_range(), llvm::FunctionImporter::None, llvm::FunctionImporter::NotEligible, llvm::FunctionImporter::NotLive, and shouldSkipLocalInAnotherModule().
Referenced by selectCallee().
◆ replaceAliasWithAliasee()
◆ selectCallee()
Given a list of possible callee implementation for a call site, select one that fits the Threshold for function definition import.
If none are found, the Reason will give the last reason for the failure (last, in the order of CalleeSummaryList entries). While looking for a callee definition, sets TooLargeOrNoInlineSummary to the last seen too-large or noinline candidate; other modules may want to know the function summary or declaration even if a definition is not needed.
FIXME: select "best" instead of first that fits. But what is "best"?
- The smallest: more likely to be inlined.
- The one with the least outgoing edges (already well optimized).
- One from a module already being imported from in order to reduce the number of source modules parsed/linked.
- One that has PGO data attached.
- [insert you fancy metric here]
Definition at line 302 of file FunctionImport.cpp.
References llvm::cast(), llvm::ForceImportAll, llvm::FunctionImporter::NoInline, llvm::FunctionImporter::None, qualifyCalleeCandidates(), and llvm::FunctionImporter::TooLarge.
◆ shouldSkipLocalInAnotherModule()
◆ STATISTIC() [1/9]
| STATISTIC | ( | NumDeadSymbols | , |
|---|---|---|---|
| "Number of dead stripped symbols in index" | ) |
◆ STATISTIC() [2/9]
| STATISTIC | ( | NumImportedCriticalFunctionsThinLink | , |
|---|---|---|---|
| "Number of critical functions thin link decided to import" | ) |
◆ STATISTIC() [3/9]
| STATISTIC | ( | NumImportedFunctions | , |
|---|---|---|---|
| "Number of functions imported in backend" | ) |
◆ STATISTIC() [4/9]
| STATISTIC | ( | NumImportedFunctionsThinLink | , |
|---|---|---|---|
| "Number of functions thin link decided to import" | ) |
◆ STATISTIC() [5/9]
| STATISTIC | ( | NumImportedGlobalVars | , |
|---|---|---|---|
| "Number of global variables imported in backend" | ) |
◆ STATISTIC() [6/9]
| STATISTIC | ( | NumImportedGlobalVarsThinLink | , |
|---|---|---|---|
| "Number of global variables thin link decided to import" | ) |
◆ STATISTIC() [7/9]
| STATISTIC | ( | NumImportedHotFunctionsThinLink | , |
|---|---|---|---|
| "Number of hot functions thin link decided to import" | ) |
◆ STATISTIC() [8/9]
| STATISTIC | ( | NumImportedModules | , |
|---|---|---|---|
| "Number of modules imported from" | ) |
◆ STATISTIC() [9/9]
| STATISTIC | ( | NumLiveSymbols | , |
|---|---|---|---|
| "Number of live symbols in index" | ) |