Index: lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- lib/Transforms/IPO/FunctionImport.cpp +++ lib/Transforms/IPO/FunctionImport.cpp @@ -129,6 +129,10 @@ CalleeSummaryList, [&](const std::unique_ptr &SummaryPtr) { auto *GVSummary = SummaryPtr.get(); + + if (GVSummary->getSummaryKind() == + GlobalValueSummary::SummaryKind::GlobalVarKind) + return false; if (GlobalValue::isInterposableLinkage(GVSummary->linkage())) // There is no point in importing these, we can't inline them return false; Index: test/Transforms/FunctionImport/Inputs/funcimport_var2.ll =================================================================== --- test/Transforms/FunctionImport/Inputs/funcimport_var2.ll +++ test/Transforms/FunctionImport/Inputs/funcimport_var2.ll @@ -0,0 +1,7 @@ +@link = internal global i32 0, align 4 + +; Function Attrs: norecurse nounwind readnone uwtable +define nonnull i32* @get_link() local_unnamed_addr { + ret i32* @link +} + Index: test/Transforms/FunctionImport/funcimport_var.ll =================================================================== --- test/Transforms/FunctionImport/funcimport_var.ll +++ test/Transforms/FunctionImport/funcimport_var.ll @@ -0,0 +1,13 @@ +; This test makes sure a static var is not selected as a callee target +; (which will crash compilation). +; RUN: opt -module-summary %s -o %t.bc +; RUN: opt -module-summary %p/Inputs/funcimport_var2.ll -o %t2.bc +; RUN: llvm-lto -thinlto -thinlto-action=thinlink -o %t3 %t.bc %t2.bc +; RUN: llvm-lto -thinlto -thinlto-action=import -thinlto-index=%t3 %t.bc %t2.bc +define i32 @_Z4LinkPKcS0_(i8*, i8*) local_unnamed_addr { + %3 = tail call i32 @link(i8* %0, i8* %1) #2 + ret i32 %3 +} + +; Function Attrs: nounwind +declare i32 @link(i8*, i8*) local_unnamed_addr