summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/FunctionImport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionImport.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/FunctionImport.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp
index b68058cbeea..c106f1105e7 100644
--- a/llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -544,9 +544,25 @@ void llvm::computeDeadSymbols(
if (S->isLive())
return;
- // We do not keep live symbols that are known to be non-prevailing.
- if (isPrevailing(VI.getGUID()) == PrevailingType::No)
- return;
+ // We only keep live symbols that are known to be non-prevailing if any are
+ // available_externally. Those symbols are discarded later in the
+ // EliminateAvailableExternally pass and setting them to not-live breaks
+ // downstreams users of liveness information (PR36483).
+ if (isPrevailing(VI.getGUID()) == PrevailingType::No) {
+ bool AvailableExternally = false;
+ for (auto &S : VI.getSummaryList())
+ if (S->linkage() == GlobalValue::AvailableExternallyLinkage)
+ AvailableExternally = true;
+
+ if (!AvailableExternally)
+ return;
+
+#ifndef NDEBUG
+ for (auto &S : VI.getSummaryList())
+ assert(!GlobalValue::isInterposableLinkage(S->linkage()) &&
+ "Symbol with interposable and available_externally linkages");
+#endif
+ }
for (auto &S : VI.getSummaryList())
S->setLive(true);
OpenPOWER on IntegriCloud