diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp index 5b8cd343557fa..d34f3211dc463 100644 --- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp @@ -1307,9 +1307,17 @@ void SelectionDAGBuilder::visitGCRelocate(const GCRelocateInst &Relocate) { void SelectionDAGBuilder::LowerDeoptimizeCall(const CallInst *CI) { const auto &TLI = DAG.getTargetLoweringInfo(); - SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(RTLIB::DEOPTIMIZE), - TLI.getPointerTy(DAG.getDataLayout())); + RTLIB::LibcallImpl DeoptImpl = TLI.getLibcallImpl(RTLIB::DEOPTIMIZE); + if (DeoptImpl == RTLIB::Unsupported) { + DAG.getContext()->emitError("no deoptimize libcall available"); + return; + } + + SDValue Callee = + DAG.getExternalSymbol(DeoptImpl, TLI.getPointerTy(DAG.getDataLayout())); + + // FIXME: Should pass in the calling convention for the LibcallImpl. // We don't lower calls to __llvm_deoptimize as varargs, but as a regular // call. We also do not lower the return value to any virtual register, and // change the immediately following return to a trap instruction. diff --git a/llvm/test/CodeGen/AMDGPU/llvm.deoptimize.ll b/llvm/test/CodeGen/AMDGPU/llvm.deoptimize.ll index ef8c00bb3b4b0..53446b644445a 100644 --- a/llvm/test/CodeGen/AMDGPU/llvm.deoptimize.ll +++ b/llvm/test/CodeGen/AMDGPU/llvm.deoptimize.ll @@ -1,10 +1,6 @@ -; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s 2> %t.err | FileCheck %s -; RUN: FileCheck -check-prefix=ERR %s < %t.err +; RUN: not llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s 2>&1 | FileCheck %s -; ERR: error: :0:0: in function caller_0 i32 (): unsupported external symbol -; ERR: error: unhandled statepoint-like instruction - -; CHECK: ;unsupported statepoint/stackmap/patchpoint +; CHECK: error: no deoptimize libcall available declare i32 @llvm.experimental.deoptimize.i32(...) declare i8 @llvm.experimental.deoptimize.i8(...)