Index: llvm/lib/Analysis/ModuleSummaryAnalysis.cpp =================================================================== --- llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -618,6 +618,16 @@ Index.addGlobalValueSummary(V, std::move(GVarSummary)); } +static const GlobalValue *getAliasee(const GlobalAlias &A) +{ + const GlobalValue *Aliasee = A.getBaseObject(); + if (Aliasee) + return Aliasee; + + // Workaround for PR46340 + return dyn_cast(A.getAliasee()); +} + static void computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A, DenseSet &CantBePromoted) { @@ -626,7 +636,8 @@ /* Live = */ false, A.isDSOLocal(), A.hasLinkOnceODRLinkage() && A.hasGlobalUnnamedAddr()); auto AS = std::make_unique(Flags); - auto *Aliasee = A.getBaseObject(); + auto *Aliasee = getAliasee(A); + assert(Aliasee && "Aliasee is null"); auto AliaseeVI = Index.getValueInfo(Aliasee->getGUID()); assert(AliaseeVI && "Alias expects aliasee summary to be available"); assert(AliaseeVI.getSummaryList().size() == 1 && Index: llvm/test/Bitcode/thinlto-summary-alias-ifunc.ll =================================================================== --- /dev/null +++ llvm/test/Bitcode/thinlto-summary-alias-ifunc.ll @@ -0,0 +1,19 @@ +; RUN: opt -module-summary %s -o - | llvm-bcanalyzer -dump | FileCheck %s + +; PR46340 +; Check that alias-to-ifunc is properly generated in the module summary. + +; CHECK: + +@bar = dso_local alias void (), void ()* @foo +@foo = dso_local ifunc void (), bitcast (i8* ()* @foo_ifunc to void ()*) + +define internal i8* @foo_ifunc() { + ret i8* bitcast (void ()* @foo_impl to i8*) +} + +define internal void @foo_impl() { + ret void +}