LLVM 17.0.0git
|
#include "llvm/Transforms/IPO/FunctionImport.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/InitializePasses.h"
#include "llvm/Linker/IRMover.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO/Internalize.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/FunctionImportUtils.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <cassert>
#include <memory>
#include <set>
#include <string>
#include <system_error>
#include <tuple>
#include <utility>
Go to the source code of this file.
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") | |
static std::unique_ptr< Module > | loadFile (const std::string &FileName, LLVMContext &Context) |
static const GlobalValueSummary * | selectCallee (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary > > CalleeSummaryList, unsigned Threshold, StringRef CallerModulePath, FunctionImporter::ImportFailureReason &Reason, GlobalValue::GUID GUID) |
Given a list of possible callee implementation for a call site, select one that fits the Threshold . | |
static bool | shouldImportGlobal (const ValueInfo &VI, const GVSummaryMapTy &DefinedGVSummaries) |
static void | computeImportForReferencedGlobals (const GlobalValueSummary &Summary, const ModuleSummaryIndex &Index, const GVSummaryMapTy &DefinedGVSummaries, SmallVectorImpl< EdgeInfo > &Worklist, FunctionImporter::ImportMapTy &ImportList, StringMap< FunctionImporter::ExportSetTy > *ExportLists) |
static const char * | getFailureName (FunctionImporter::ImportFailureReason Reason) |
static void | computeImportForFunction (const FunctionSummary &Summary, const ModuleSummaryIndex &Index, const unsigned Threshold, const GVSummaryMapTy &DefinedGVSummaries, SmallVectorImpl< EdgeInfo > &Worklist, FunctionImporter::ImportMapTy &ImportList, StringMap< FunctionImporter::ExportSetTy > *ExportLists, FunctionImporter::ImportThresholdsTy &ImportThresholds) |
Compute the list of functions to import for a given caller. | |
static void | ComputeImportForModule (const GVSummaryMapTy &DefinedGVSummaries, const ModuleSummaryIndex &Index, StringRef ModName, FunctionImporter::ImportMapTy &ImportList, StringMap< FunctionImporter::ExportSetTy > *ExportLists=nullptr) |
Given the list of globals defined in a module, compute the list of imports as well as the list of "exports", i.e. | |
static bool | isGlobalVarSummary (const ModuleSummaryIndex &Index, ValueInfo VI) |
static bool | isGlobalVarSummary (const ModuleSummaryIndex &Index, GlobalValue::GUID G) |
template<class T > | |
static unsigned | numGlobalVarSummaries (const ModuleSummaryIndex &Index, T &Cont) |
static bool | checkVariableImport (const ModuleSummaryIndex &Index, StringMap< FunctionImporter::ImportMapTy > &ImportLists, StringMap< FunctionImporter::ExportSetTy > &ExportLists) |
static void | dumpImportListForModule (const ModuleSummaryIndex &Index, StringRef ModulePath, FunctionImporter::ImportMapTy &ImportList) |
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 | doImportingForModule (Module &M) |
Variables | |
static cl::opt< unsigned > | 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 > | 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< bool > | ForceImportAll ("force-import-all", cl::init(false), cl::Hidden, cl::desc("Import functions with noinline attribute")) |
static cl::opt< float > | 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 > | 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 > | 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 > | 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 > | 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 > | PrintImports ("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions")) |
static cl::opt< bool > | PrintImportFailures ("print-import-failures", cl::init(false), cl::Hidden, cl::desc("Print information for functions rejected for importing")) |
static cl::opt< bool > | ComputeDead ("compute-dead", cl::init(true), cl::Hidden, cl::desc("Compute dead symbols")) |
static cl::opt< bool > | EnableImportMetadata ("enable-import-metadata", cl::init(false), cl::Hidden, cl::desc("Enable import metadata like 'thinlto_src_module'")) |
static cl::opt< std::string > | 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 > | ImportAllIndex ("import-all-index", cl::desc("Import all external functions in index.")) |
Used when testing importing from distributed indexes via opt. | |
#define DEBUG_TYPE "function-import" |
Definition at line 59 of file FunctionImport.cpp.
|
static |
Definition at line 621 of file FunctionImport.cpp.
References llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::count(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), and VI.
Referenced by llvm::ComputeCrossModuleImport().
|
static |
Compute the list of functions to import for a given caller.
Mark these imported functions and the symbols they reference in their source module as exported from their source module.
Definition at line 348 of file FunctionImport.cpp.
References llvm::FunctionSummary::FFlags::AlwaysInline, assert(), computeImportForReferencedGlobals(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::dbgs(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::errs(), llvm::FunctionSummary::fflags(), ForceImportAll, getFailureName(), ImportColdMultiplier, ImportCriticalMultiplier, ImportCutoff, ImportHotInstrFactor, ImportHotMultiplier, ImportInstrFactor, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), llvm::FunctionSummary::instCount(), IT, LLVM_DEBUG, llvm::logAllUnhandledErrors(), llvm::make_error_code(), llvm::GlobalValueSummary::modulePath(), PrintImportFailures, selectCallee(), and VI.
Referenced by ComputeImportForModule().
|
static |
Given the list of globals defined in a module, compute the list of imports as well as the list of "exports", i.e.
the list of symbols referenced from another module (that may require promotion).
Definition at line 521 of file FunctionImport.cpp.
References assert(), computeImportForFunction(), computeImportForReferencedGlobals(), llvm::dbgs(), llvm::SmallVectorBase< Size_T >::empty(), getFailureName(), llvm::getHotnessName(), I, ImportInstrLimit, LLVM_DEBUG, llvm::SmallVectorImpl< T >::pop_back_val(), PrintImportFailures, and VI.
Referenced by llvm::ComputeCrossModuleImport(), and llvm::ComputeCrossModuleImportForModule().
|
static |
Definition at line 271 of file FunctionImport.cpp.
References llvm::dbgs(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), llvm::GlobalValue::isLocalLinkage(), LLVM_DEBUG, shouldImportGlobal(), and VI.
Referenced by computeImportForFunction(), and ComputeImportForModule().
Definition at line 1397 of file FunctionImport.cpp.
References llvm::ComputeCrossModuleImportForModule(), llvm::ComputeCrossModuleImportForModuleFromIndex(), llvm::errs(), llvm::GlobalValue::ExternalLinkage, llvm::getModuleSummaryIndexForFile(), I, ImportAllIndex, llvm::FunctionImporter::importFunctions(), llvm::GlobalValue::isLocalLinkage(), loadFile(), llvm::logAllUnhandledErrors(), llvm::renameModuleForThinLTO(), llvm::report_fatal_error(), SummaryFile, and llvm::Expected< T >::takeError().
Referenced by llvm::FunctionImportPass::run().
|
static |
Definition at line 744 of file FunctionImport.cpp.
References llvm::dbgs(), LLVM_DEBUG, numGlobalVarSummaries(), and llvm::StringMapImpl::size().
Referenced by llvm::ComputeCrossModuleImportForModule(), and llvm::ComputeCrossModuleImportForModuleFromIndex().
|
static |
Definition at line 323 of file FunctionImport.cpp.
References llvm_unreachable.
Referenced by computeImportForFunction(), and ComputeImportForModule().
|
static |
Definition at line 1242 of file FunctionImport.cpp.
References llvm::GlobalValue::DefaultVisibility, and llvm::GlobalValue::InternalLinkage.
Referenced by llvm::FunctionImporter::importFunctions().
|
static |
Definition at line 601 of file FunctionImport.cpp.
References G, isGlobalVarSummary(), and VI.
|
static |
Definition at line 594 of file FunctionImport.cpp.
References llvm::GlobalValueSummary::GlobalVarKind, and VI.
Referenced by isGlobalVarSummary(), and numGlobalVarSummaries().
|
static |
Definition at line 145 of file FunctionImport.cpp.
References Context, llvm::dbgs(), llvm::errs(), llvm::getLazyIRFileModule(), LLVM_DEBUG, and llvm::report_fatal_error().
Referenced by doImportingForModule().
|
static |
Definition at line 609 of file FunctionImport.cpp.
References isGlobalVarSummary().
Referenced by llvm::ComputeCrossModuleImport(), and dumpImportListForModule().
|
static |
Make alias a clone of its aliasee.
Definition at line 1226 of file FunctionImport.cpp.
References llvm::CloneFunction(), llvm::GlobalAlias::getAliaseeObject(), llvm::ConstantExpr::getBitCast(), llvm::GlobalValue::getLinkage(), llvm::GlobalValue::getType(), llvm::GlobalValue::getVisibility(), llvm::Value::replaceAllUsesWith(), llvm::GlobalValue::setLinkage(), llvm::GlobalValue::setVisibility(), and llvm::Value::takeName().
Referenced by llvm::FunctionImporter::importFunctions().
|
static |
Given a list of possible callee implementation for a call site, select one that fits the Threshold
.
FIXME: select "best" instead of first that fits. But what is "best"?
Definition at line 173 of file FunctionImport.cpp.
References llvm::find_if(), ForceImportAll, if(), llvm::GlobalValue::isInterposableLinkage(), and llvm::GlobalValue::isLocalLinkage().
Referenced by computeImportForFunction().
|
static |
Definition at line 248 of file FunctionImport.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::GlobalValue::isInterposableLinkage(), and VI.
Referenced by computeImportForReferencedGlobals().
STATISTIC | ( | NumDeadSymbols | , |
"Number of dead stripped symbols in index" | |||
) |
STATISTIC | ( | NumImportedCriticalFunctionsThinLink | , |
"Number of critical functions thin link decided to import" | |||
) |
STATISTIC | ( | NumImportedFunctions | , |
"Number of functions imported in backend" | |||
) |
STATISTIC | ( | NumImportedFunctionsThinLink | , |
"Number of functions thin link decided to import" | |||
) |
STATISTIC | ( | NumImportedGlobalVars | , |
"Number of global variables imported in backend" | |||
) |
STATISTIC | ( | NumImportedGlobalVarsThinLink | , |
"Number of global variables thin link decided to import" | |||
) |
STATISTIC | ( | NumImportedHotFunctionsThinLink | , |
"Number of hot functions thin link decided to import" | |||
) |
STATISTIC | ( | NumImportedModules | , |
"Number of modules imported from" | |||
) |
STATISTIC | ( | NumLiveSymbols | , |
"Number of live symbols in index" | |||
) |
void updateValueInfoForIndirectCalls | ( | ModuleSummaryIndex & | Index, |
FunctionSummary * | FS | ||
) |
Definition at line 808 of file FunctionImport.cpp.
References llvm::any_of(), and VI.
Referenced by llvm::computeDeadSymbolsAndUpdateIndirectCalls(), and llvm::updateIndirectCalls().
|
static |
Referenced by llvm::computeDeadSymbolsAndUpdateIndirectCalls().
|
static |
Referenced by llvm::FunctionImporter::importFunctions().
|
static |
Referenced by computeImportForFunction(), and selectCallee().
|
static |
Used when testing importing from distributed indexes via opt.
Referenced by doImportingForModule().
|
static |
Referenced by computeImportForFunction().
|
static |
Referenced by computeImportForFunction().
|
static |
Referenced by computeImportForFunction().
|
static |
Referenced by computeImportForFunction().
|
static |
Referenced by computeImportForFunction().
|
static |
Referenced by computeImportForFunction().
|
static |
Limit on instruction count of imported functions.
Referenced by ComputeImportForModule().
|
static |
Referenced by computeImportForFunction(), and ComputeImportForModule().
|
static |
Referenced by llvm::FunctionImporter::importFunctions().
|
static |
Summary file to use for function importing when using -function-import from the command line.
Referenced by doImportingForModule().