Index: llvm/lib/IR/Globals.cpp =================================================================== --- llvm/lib/IR/Globals.cpp +++ llvm/lib/IR/Globals.cpp @@ -590,7 +590,7 @@ const Function *GlobalIFunc::getResolverFunction() const { DenseSet Aliases; - return dyn_cast( + return dyn_cast_or_null( findBaseObject(getResolver(), Aliases, [](const GlobalValue &) {})); } Index: llvm/test/Assembler/ifunc-unhandled-constantexpr.ll =================================================================== --- /dev/null +++ llvm/test/Assembler/ifunc-unhandled-constantexpr.ll @@ -0,0 +1,12 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; Make sure nothing asserts on an unhandled constantexpr for the +; resolver. + +; CHECK: IFunc must have a Function resolver +; CHECK-NEXT: ptr @ifunc_shl +@ifunc_shl = ifunc void (), ptr inttoptr (i64 shl (i64 ptrtoint (ptr @resolver to i64), i64 4) to ptr) + +define ptr @resolver() { + ret ptr null +}