LLVM  6.0.0svn
Macros | Functions | Variables
FunctionImport.cpp File Reference
#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/StringSet.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/IR/AutoUpgrade.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/FunctionImportUtils.h"
#include <cassert>
#include <memory>
#include <set>
#include <string>
#include <system_error>
#include <tuple>
#include <utility>
Include dependency graph for FunctionImport.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "function-import"
 

Functions

 STATISTIC (NumImportedFunctions, "Number of functions imported")
 
 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< ModuleloadFile (const std::string &FileName, LLVMContext &Context)
 
static const GlobalValueSummaryselectCallee (const ModuleSummaryIndex &Index, ArrayRef< std::unique_ptr< GlobalValueSummary >> CalleeSummaryList, unsigned Threshold, StringRef CallerModulePath)
 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 computeImportForFunction (const FunctionSummary &Summary, const ModuleSummaryIndex &Index, const unsigned Threshold, const GVSummaryMapTy &DefinedGVSummaries, SmallVectorImpl< EdgeInfo > &Worklist, FunctionImporter::ImportMapTy &ImportList, StringMap< FunctionImporter::ExportSetTy > *ExportLists=nullptr)
 Compute the list of functions to import for a given caller. More...
 
static void ComputeImportForModule (const GVSummaryMapTy &DefinedGVSummaries, const ModuleSummaryIndex &Index, 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 doImportingForModule (Module &M)
 
 INITIALIZE_PASS (FunctionImportLegacyPass, "function-import", "Summary Based Function Import", false, false) namespace llvm
 

Variables

static cl::opt< unsignedImportInstrLimit ("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< 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< boolPrintImports ("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions"))
 
static cl::opt< boolComputeDead ("compute-dead", cl::init(true), cl::Hidden, cl::desc("Compute dead symbols"))
 
static cl::opt< boolEnableImportMetadata ("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...
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "function-import"

Definition at line 58 of file FunctionImport.cpp.

Function Documentation

◆ computeImportForFunction()

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 = nullptr 
)
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.

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.

Definition at line 237 of file FunctionImport.cpp.

References assert(), llvm::FunctionSummary::calls(), llvm::CalleeInfo::Cold, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::count(), llvm::CalleeInfo::Critical, llvm::dbgs(), DEBUG, llvm::SmallVectorImpl< T >::emplace_back(), llvm::ValueInfo::getGUID(), llvm::CalleeInfo::Hot, ImportColdMultiplier, ImportCriticalMultiplier, ImportHotInstrFactor, ImportHotMultiplier, ImportInstrFactor, llvm::GlobalValueSummary::modulePath(), selectCallee(), Threshold, updateValueInfoForIndirectCalls(), and VI.

Referenced by ComputeImportForModule().

◆ ComputeImportForModule()

static void ComputeImportForModule ( const GVSummaryMapTy DefinedGVSummaries,
const ModuleSummaryIndex Index,
FunctionImporter::ImportMapTy ImportList,
StringMap< FunctionImporter::ExportSetTy > *  ExportLists = nullptr 
)
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 341 of file FunctionImport.cpp.

References computeImportForFunction(), llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::SmallVectorBase::empty(), ImportInstrLimit, llvm::ModuleSummaryIndex::isGlobalValueLive(), llvm::SmallVectorImpl< T >::pop_back_val(), and Threshold.

Referenced by llvm::ComputeCrossModuleImport(), and llvm::ComputeCrossModuleImportForModule().

◆ doImportingForModule()

static bool doImportingForModule ( Module M)
static

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( FunctionImportLegacyPass  ,
"function-import"  ,
"Summary Based Function Import"  ,
false  ,
false   
)

Definition at line 890 of file FunctionImport.cpp.

References llvm::createFunctionImportPass().

◆ loadFile()

static std::unique_ptr<Module> loadFile ( const std::string &  FileName,
LLVMContext Context 
)
static

◆ selectCallee()

static const GlobalValueSummary* selectCallee ( const ModuleSummaryIndex Index,
ArrayRef< std::unique_ptr< GlobalValueSummary >>  CalleeSummaryList,
unsigned  Threshold,
StringRef  CallerModulePath 
)
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"?

  • 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 150 of file FunctionImport.cpp.

References llvm::find_if(), llvm::GlobalValueSummary::GlobalVarKind, llvm::GlobalValue::isInterposableLinkage(), llvm::GlobalValue::isLocalLinkage(), and Threshold.

Referenced by computeImportForFunction().

◆ STATISTIC() [1/4]

STATISTIC ( NumImportedFunctions  ,
"Number of functions imported"   
)

◆ STATISTIC() [2/4]

STATISTIC ( NumImportedModules  ,
"Number of modules imported from"   
)

◆ STATISTIC() [3/4]

STATISTIC ( NumDeadSymbols  ,
"Number of dead stripped symbols in index"   
)

◆ STATISTIC() [4/4]

STATISTIC ( NumLiveSymbols  ,
"Number of live symbols in index"   
)

◆ updateValueInfoForIndirectCalls()

static ValueInfo updateValueInfoForIndirectCalls ( const ModuleSummaryIndex Index,
ValueInfo  VI 
)
static

Variable Documentation

◆ ComputeDead

cl::opt<bool> ComputeDead("compute-dead", cl::init(true), cl::Hidden, cl::desc("Compute dead symbols"))
static

◆ EnableImportMetadata

cl::opt<bool> EnableImportMetadata("enable-import-metadata", cl::init( true), cl::Hidden, cl::desc("Enable import metadata like 'thinlto_src_module'"))
static

◆ ImportColdMultiplier

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

◆ ImportCriticalMultiplier

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

◆ ImportHotInstrFactor

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

◆ ImportHotMultiplier

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

◆ ImportInstrFactor

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

◆ ImportInstrLimit

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"))
static

Limit on instruction count of imported functions.

Referenced by ComputeImportForModule().

◆ PrintImports

cl::opt<bool> PrintImports("print-imports", cl::init(false), cl::Hidden, cl::desc("Print imported functions"))
static

◆ SummaryFile

cl::opt<std::string> SummaryFile("summary-file", cl::desc("The summary file to use for function importing."))
static

Summary file to use for function importing when using -function-import from the command line.

Referenced by doImportingForModule().