From 05ea023e040aaa5a74cd16014cc8e72039220fbc Mon Sep 17 00:00:00 2001 From: Justin Riddell Date: Wed, 10 Sep 2025 00:01:38 +0100 Subject: [PATCH] [GlobalOpt] Fix unreachable ifunc globalopt crash (#157332) Also fixes (#131488) --- llvm/lib/Transforms/IPO/GlobalOpt.cpp | 3 ++- .../Transforms/GlobalOpt/resolve-indirect-ifunc.ll | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Transforms/GlobalOpt/resolve-indirect-ifunc.ll diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index d7edd1288309b..f88d51f443bcf 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2551,7 +2551,8 @@ static bool OptimizeNonTrivialIFuncs( })) continue; - assert(!Callees.empty() && "Expecting successful collection of versions"); + if (Callees.empty()) + continue; LLVM_DEBUG(dbgs() << "Statically resolving calls to function " << Resolver->getName() << "\n"); diff --git a/llvm/test/Transforms/GlobalOpt/resolve-indirect-ifunc.ll b/llvm/test/Transforms/GlobalOpt/resolve-indirect-ifunc.ll new file mode 100644 index 0000000000000..16c529b42a82f --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/resolve-indirect-ifunc.ll @@ -0,0 +1,11 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt --passes=globalopt -o - -S < %s | FileCheck %s + +define ptr @f1() { +; CHECK-LABEL: define ptr @f1() { +; CHECK-NEXT: unreachable +; + unreachable +} + +@i1 = ifunc void(), ptr @f1