Index: llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp =================================================================== --- llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -340,6 +340,14 @@ StripDebugInfo(*MergedM); MergedM->setModuleInlineAsm(""); + // Remove ifuncs from MergedM due the corresponding functions are also + // kept out from MergeM. + SmallVector IFuncsToErease; + for (auto &IF : MergedM->ifuncs()) + IFuncsToErease.push_back(&IF); + for (auto &IF : IFuncsToErease) + MergedM->eraseIFunc(IF); + // Clone any llvm.*used globals to ensure the included values are // not deleted. cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ false); Index: llvm/test/ThinLTO/X86/ifunc_splitlto.ll =================================================================== --- /dev/null +++ llvm/test/ThinLTO/X86/ifunc_splitlto.ll @@ -0,0 +1,31 @@ +; regresstion test for https://github.com/llvm/llvm-project/issues/60962 +; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s +; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s +; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +@i = ifunc ptr (ptr, i64), ptr @hoge + +@g = constant i8 1, !type !0 +@assoc = private constant i8 2, !associated !1 + +define ptr @hoge() !type !2 { +bb: + ret ptr null +} + +; M0: @g = external constant +; M0: @i = ifunc ptr (ptr, i64), ptr @hoge +; M0: define ptr @hoge() +; M0-NOT: @assoc +; M1: @g = constant i8 1 +; M1: @assoc = private constant i8 2 +; M1-NOT: @i = ifunc ptr (ptr, i64), ptr @hoge +; M1-NOT: define ptr @hoge() + +!0 = !{i32 0, !"typeid"} +!1 = !{ptr @g} +!2 = !{i64 0, !2} +!3 = distinct !{}