[PATCH] D19573: [ThinLTO] Refine fix to avoid renaming of uses in inline assembly.
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 26 17:47:53 PDT 2016
tejohnson created this revision.
tejohnson added a reviewer: joker.eph.
tejohnson added a subscriber: llvm-commits.
Herald added a subscriber: joker.eph.
Refine the workaround from r266877 that attempts to prevent
renaming of locals in inline assembly, so that in addition to looking
for a llvm.used local value, that there is at least one inline assembly
call in the module. Otherwise, debug functions added to the llvm.used
can block importing/exporting unnecessarily.
http://reviews.llvm.org/D19573
Files:
lib/Analysis/ModuleSummaryAnalysis.cpp
lib/Transforms/Utils/FunctionImportUtils.cpp
Index: lib/Transforms/Utils/FunctionImportUtils.cpp
===================================================================
--- lib/Transforms/Utils/FunctionImportUtils.cpp
+++ lib/Transforms/Utils/FunctionImportUtils.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Utils/FunctionImportUtils.h"
+#include "llvm/IR/Instructions.h"
using namespace llvm;
/// Checks if we should import SGV as a definition, otherwise import as a
@@ -206,25 +207,32 @@
}
void FunctionImportGlobalProcessing::processGlobalsForThinLTO() {
- // We cannot currently promote or rename anything that is in llvm.used,
- // since any such value may have a use that won't see the new name.
- // Specifically, any uses within inline assembly are not visible to the
- // compiler. Prevent changing any such values on the exporting side,
+ // We cannot currently promote or rename anything used in inline assembly,
+ // which are not visible to the compiler. Detect a possible case by looking
+ // for a llvm.used local value, in conjunction with an inline assembly call
+ // in the module. Prevent changing any such values on the exporting side,
// since we would already have guarded against an import from this module by
// suppressing its index generation. See comments on what is required
// in order to implement a finer grained solution in
// ModuleSummaryIndexBuilder::ModuleSummaryIndexBuilder().
SmallPtrSet<GlobalValue *, 8> Used;
collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
+ bool LocalIsUsed = false;
for (GlobalValue *V : Used) {
- if (!V->hasLocalLinkage())
- continue;
// We would have blocked importing from this module by suppressing index
// generation.
- assert(!isPerformingImport() &&
+ assert((!V->hasLocalLinkage() || !isPerformingImport()) &&
"Should have blocked importing from module with local used");
- return;
+ if ((LocalIsUsed |= V->hasLocalLinkage()))
+ break;
}
+ if (LocalIsUsed)
+ for (auto &F : M)
+ for (auto &BB : F)
+ for (auto &I : BB)
+ if (const CallInst *CallI = dyn_cast<CallInst>(&I))
+ if (CallI->isInlineAsm())
+ return;
for (GlobalVariable &GV : M.globals())
processGlobalForThinLTO(GV);
Index: lib/Analysis/ModuleSummaryAnalysis.cpp
===================================================================
--- lib/Analysis/ModuleSummaryAnalysis.cpp
+++ lib/Analysis/ModuleSummaryAnalysis.cpp
@@ -119,10 +119,10 @@
const Module *M,
std::function<BlockFrequencyInfo *(const Function &F)> Ftor)
: Index(llvm::make_unique<ModuleSummaryIndex>()), M(M) {
- // We cannot currently promote or rename anything that is in llvm.used,
- // since any such value may have a use that won't see the new name.
- // Specifically, any uses within inline assembly are not visible to the
- // compiler. Prevent importing of any modules containing these uses by
+ // We cannot currently promote or rename anything used in inline assembly,
+ // which are not visible to the compiler. Detect a possible case by looking
+ // for a llvm.used local value, in conjunction with an inline assembly call
+ // in the module. Prevent importing of any modules containing these uses by
// suppressing generation of the index. This also prevents importing
// into this module, which is also necessary to avoid needing to rename
// in case of a name clash between a local in this module and an imported
@@ -139,10 +139,18 @@
// with a reference could be exported).
SmallPtrSet<GlobalValue *, 8> Used;
collectUsedGlobalVariables(*M, Used, /*CompilerUsed*/ false);
+ bool LocalIsUsed = false;
for (GlobalValue *V : Used) {
- if (V->hasLocalLinkage())
- return;
+ if ((LocalIsUsed |= V->hasLocalLinkage()))
+ break;
}
+ if (LocalIsUsed)
+ for (auto &F : *M)
+ for (auto &BB : F)
+ for (auto &I : BB)
+ if (const CallInst *CallI = dyn_cast<CallInst>(&I))
+ if (CallI->isInlineAsm())
+ return;
// Compute summaries for all functions defined in module, and save in the
// index.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D19573.55143.patch
Type: text/x-patch
Size: 4216 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160427/4a629ca5/attachment.bin>
More information about the llvm-commits
mailing list