diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp --- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp @@ -847,22 +847,17 @@ #endif SDValue ActualCallee; + SDValue Callee = getValue(ISP.getCalledValue()); if (ISP.getNumPatchBytes() > 0) { // If we've been asked to emit a nop sequence instead of a call instruction // for this statepoint then don't lower the call target, but use a constant - // `null` instead. Not lowering the call target lets statepoint clients get - // away without providing a physical address for the symbolic call target at - // link time. - - const auto &TLI = DAG.getTargetLoweringInfo(); - const auto &DL = DAG.getDataLayout(); - - unsigned AS = ISP.getCalledValue()->getType()->getPointerAddressSpace(); - ActualCallee = - DAG.getTargetConstant(0, getCurSDLoc(), TLI.getPointerTy(DL, AS)); + // `undef` instead. Not lowering the call target lets statepoint clients + // get away without providing a physical address for the symbolic call + // target at link time. + ActualCallee = DAG.getUNDEF(Callee.getValueType()); } else { - ActualCallee = getValue(ISP.getCalledValue()); + ActualCallee = Callee; } StatepointLoweringInfo SI(DAG); diff --git a/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll b/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/statepoint-no-extra-const.ll @@ -0,0 +1,23 @@ +; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s + +define i8 addrspace(1)* @no_extra_const(i8 addrspace(1)* %obj) gc "statepoint-example" { +; CHECK-LABEL: no_extra_const: +; CHECK: .cfi_startproc +; CHECK-NEXT: # %bb.0: # %entry +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: movq %rdi, (%rsp) +; CHECK-NEXT: nopl 8(%rax) +; CHECK-NEXT: .Ltmp0: +; CHECK-NEXT: movq (%rsp), %rax +; CHECK-NEXT: popq %rcx +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: retq +entry: + %safepoint_token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 4, void ()* null, i32 0, i32 0, i32 0, i32 0, i8 addrspace(1)* %obj) + %obj.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %safepoint_token, i32 7, i32 7) ; (%obj, %obj) + ret i8 addrspace(1)* %obj.relocated +} + +declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) +declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32)