[ModuleSummaryAnalysis] Don't crash when referencing unnamed globals.

Instead, just be conservative as these are unfrequent enough. Thanks
to Peter Collingbourne for the discussion about this on IRC.

llvm-svn: 295861
This commit is contained in:
Davide Italiano 2017-02-22 18:53:38 +00:00
parent 7ea5adfff4
commit e122d6885a
2 changed files with 16 additions and 0 deletions

View File

@ -447,6 +447,12 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
auto &Summary = GlobalList.second[0]; auto &Summary = GlobalList.second[0];
bool AllRefsCanBeExternallyReferenced = bool AllRefsCanBeExternallyReferenced =
llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) { llvm::all_of(Summary->refs(), [&](const ValueInfo &VI) {
// If a global value definition references an unnamed global,
// be conservative. They're valid IR so we don't want to crash
// when we encounter any of them but they're infrequent enough
// that we don't bother optimizing them.
if (!VI.getValue()->hasName())
return false;
return !CantBePromoted.count(VI.getValue()->getGUID()); return !CantBePromoted.count(VI.getValue()->getGUID());
}); });
if (!AllRefsCanBeExternallyReferenced) { if (!AllRefsCanBeExternallyReferenced) {

View File

@ -0,0 +1,10 @@
; Make sure we don't crash when referencing an unnamed global.
; RUN: opt %s -module-summary-analysis -S
@0 = external global [1 x { i64 }]
define internal void @tinkywinky() {
call void @patatino(i64 ptrtoint ([1 x { i64 }]* @0 to i64), i64 4)
ret void
}
declare void @patatino(i64, i64)