diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/FunctionImport.cpp')
| -rw-r--r-- | llvm/lib/Transforms/IPO/FunctionImport.cpp | 22 |
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); |

