summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2015-11-24 19:55:04 +0000
committerTeresa Johnson <tejohnson@google.com>2015-11-24 19:55:04 +0000
commit130de7af7f41b561e9f63bf29b8d9628d3f86369 (patch)
tree3c53cb991c2b38c75ea9bcd3e55aadef0ec202f4 /llvm/lib/Transforms
parentdb6220f84d2514c4fce507593f4b597287e8377a (diff)
downloadbcm5719-llvm-130de7af7f41b561e9f63bf29b8d9628d3f86369.tar.gz
bcm5719-llvm-130de7af7f41b561e9f63bf29b8d9628d3f86369.zip
[ThinLTO] Enable iterative importing in FunctionImport pass
Analyze imported function bodies and add any new external calls to the worklist for importing. Currently no controls on the importing so this will end up importing everything possible in the call tree below the importing module. Basic profitability checks coming next. Update test to check for iteratively inlined functions. llvm-svn: 254011
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/IPO/FunctionImport.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp
index c874e4f5da7..bd6eb8391dc 100644
--- a/llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -131,10 +131,24 @@ bool FunctionImporter::importFunctions(Module &M) {
// The function that we will import!
GlobalValue *SGV = Module.getNamedValue(CalledFunctionName);
+ StringRef ImportFunctionName = CalledFunctionName;
+ if (!SGV) {
+ // Might be local in source Module, promoted/renamed in dest Module M.
+ std::pair<StringRef, StringRef> Split =
+ CalledFunctionName.split(".llvm.");
+ SGV = Module.getNamedValue(Split.first);
+#ifndef NDEBUG
+ // Assert that Split.second is module id
+ uint64_t ModuleId;
+ assert(!Split.second.getAsInteger(10, ModuleId));
+ assert(ModuleId == Index.getModuleId(FileName));
+#endif
+ }
Function *F = dyn_cast<Function>(SGV);
if (!F && isa<GlobalAlias>(SGV)) {
auto *SGA = dyn_cast<GlobalAlias>(SGV);
F = dyn_cast<Function>(SGA->getBaseObject());
+ ImportFunctionName = F->getName();
}
if (!F) {
errs() << "Can't load function '" << CalledFunctionName << "' in Module '"
@@ -156,8 +170,28 @@ bool FunctionImporter::importFunctions(Module &M) {
if (L.linkInModule(&Module, Linker::Flags::None, &Index, F))
report_fatal_error("Function Import: link error");
- // TODO: Process the newly imported function and add callees to the
- // worklist.
+ // Process the newly imported function and add callees to the worklist.
+ GlobalValue *NewGV = M.getNamedValue(ImportFunctionName);
+ assert(NewGV);
+ Function *NewF = dyn_cast<Function>(NewGV);
+ assert(NewF);
+
+ for (auto &BB : *NewF) {
+ for (auto &I : BB) {
+ if (isa<CallInst>(I)) {
+ DEBUG(dbgs() << "Found a call: '" << I << "'\n");
+ auto CalledFunction = cast<CallInst>(I).getCalledFunction();
+ // Insert any new external calls that have not already been
+ // added to set/worklist.
+ if (CalledFunction && CalledFunction->hasName() &&
+ CalledFunction->isDeclaration() &&
+ !CalledFunctions.count(CalledFunction->getName())) {
+ CalledFunctions.insert(CalledFunction->getName());
+ Worklist.push_back(CalledFunction->getName());
+ }
+ }
+ }
+ }
Changed = true;
}
OpenPOWER on IntegriCloud