LLVM
8.0.1
|
#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/ADT/StringSet.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/Linker/IRMover.h"
#include "llvm/Object/ModuleSymbolTable.h"
#include "llvm/Object/SymbolicFile.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.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 . More... | |
static ValueInfo | updateValueInfoForIndirectCalls (const ModuleSummaryIndex &Index, ValueInfo VI) |
static void | computeImportForReferencedGlobals (const FunctionSummary &Summary, const GVSummaryMapTy &DefinedGVSummaries, 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. More... | |
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. More... | |
static bool | isGlobalVarSummary (const ModuleSummaryIndex &Index, GlobalValue::GUID G) |
static GlobalValue::GUID | getGUID (GlobalValue::GUID G) |
template<class T > | |
static unsigned | numGlobalVarSummaries (const ModuleSummaryIndex &Index, T &Cont) |
static void | dumpImportListForModule (const ModuleSummaryIndex &Index, StringRef ModulePath, FunctionImporter::ImportMapTy &ImportList) |
static Function * | replaceAliasWithAliasee (Module *SrcModule, GlobalAlias *GA) |
Make alias a clone of its aliasee. More... | |
static void | internalizeImmutableGVs (Module &M) |
static bool | doImportingForModule (Module &M) |
INITIALIZE_PASS (FunctionImportLegacyPass, "function-import", "Summary Based Function Import", false, false) namespace llvm | |
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. More... | |
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< 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(true), 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. More... | |
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. More... | |
#define DEBUG_TYPE "function-import" |
Definition at line 61 of file FunctionImport.cpp.
|
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 assert(), llvm::FunctionSummary::calls(), llvm::CalleeInfo::Cold, computeImportForReferencedGlobals(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::CalleeInfo::Critical, llvm::dbgs(), llvm::SmallVectorImpl< T >::emplace_back(), llvm::ValueInfo::getGUID(), llvm::ValueInfo::getSummaryList(), llvm::CalleeInfo::Hot, 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::max(), llvm::GlobalValueSummary::modulePath(), PrintImportFailures, llvm::Ref, llvm::GlobalValueSummary::refs(), selectCallee(), Threshold, updateValueInfoForIndirectCalls(), 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 526 of file FunctionImport.cpp.
References assert(), computeImportForFunction(), llvm::dbgs(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), getFailureName(), llvm::getHotnessName(), llvm::ModuleSummaryIndex::getValueInfo(), I, ImportInstrLimit, llvm::FunctionSummary::instCount(), llvm::ModuleSummaryIndex::isGlobalValueLive(), LLVM_DEBUG, llvm::SmallVectorImpl< T >::pop_back_val(), PrintImportFailures, Threshold, and VI.
Referenced by llvm::ComputeCrossModuleImport(), and llvm::ComputeCrossModuleImportForModule().
|
static |
Definition at line 283 of file FunctionImport.cpp.
References llvm::canImportGlobalVar(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::dbgs(), llvm::StringMap< ValueTy, AllocatorTy >::insert(), llvm::GlobalValue::isLocalLinkage(), LLVM_DEBUG, llvm::GlobalValueSummary::modulePath(), llvm::GlobalValueSummary::refs(), and VI.
Referenced by computeImportForFunction().
Definition at line 1207 of file FunctionImport.cpp.
References llvm::ComputeCrossModuleImportForModule(), llvm::ComputeCrossModuleImportForModuleFromIndex(), llvm::errs(), llvm::GlobalValue::ExternalLinkage, llvm::Module::getContext(), llvm::Module::getModuleIdentifier(), 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 674 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::lltok::GlobalVar, llvm_unreachable, and llvm::None.
Referenced by ComputeImportForModule().
|
static |
Definition at line 605 of file FunctionImport.cpp.
References G.
Referenced by llvm::sampleprof::FunctionSamples::findInlinedFunctions(), and numGlobalVarSummaries().
INITIALIZE_PASS | ( | FunctionImportLegacyPass | , |
"function-import" | , | ||
"Summary Based Function Import" | , | ||
false | , | ||
false | |||
) |
Definition at line 1298 of file FunctionImport.cpp.
References llvm::createFunctionImportPass().
|
static |
Definition at line 1060 of file FunctionImport.cpp.
References llvm::GlobalValue::DefaultVisibility, llvm::Module::globals(), and llvm::GlobalValue::InternalLinkage.
|
static |
Definition at line 595 of file FunctionImport.cpp.
References llvm::ModuleSummaryIndex::getValueInfo(), llvm::GlobalValueSummary::GlobalVarKind, and VI.
Referenced by numGlobalVarSummaries().
|
static |
Definition at line 149 of file FunctionImport.cpp.
Referenced by llvm::createBlockExtractorPass(), and doImportingForModule().
|
static |
Definition at line 608 of file FunctionImport.cpp.
References getGUID(), and isGlobalVarSummary().
Referenced by llvm::ComputeCrossModuleImport(), and dumpImportListForModule().
|
static |
Make alias a clone of its aliasee.
Definition at line 1045 of file FunctionImport.cpp.
References llvm::CloneFunction(), llvm::GlobalIndirectSymbol::getBaseObject(), llvm::ConstantExpr::getBitCast(), llvm::GlobalValue::getLinkage(), llvm::GlobalValue::getType(), llvm::Value::replaceAllUsesWith(), llvm::GlobalValue::setLinkage(), and llvm::Value::takeName().
|
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 177 of file FunctionImport.cpp.
References llvm::find_if(), llvm::lltok::GlobalVar, llvm::GlobalValueSummary::GlobalVarKind, llvm::ModuleSummaryIndex::isGlobalValueLive(), llvm::GlobalValue::isInterposableLinkage(), llvm::GlobalValue::isLocalLinkage(), llvm::None, and Threshold.
Referenced by computeImportForFunction().
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 |
Definition at line 269 of file FunctionImport.cpp.
References llvm::ValueInfo::getGUID(), llvm::ModuleSummaryIndex::getGUIDFromOriginalID(), llvm::ValueInfo::getSummaryList(), and llvm::ModuleSummaryIndex::getValueInfo().
Referenced by llvm::computeDeadSymbols(), and computeImportForFunction().
|
static |
Referenced by llvm::computeDeadSymbols().
|
static |
|
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 |