Skip to content

Commit

Permalink
Remove the additional constant which requires an extra register for s…
Browse files Browse the repository at this point in the history
…tatepoint lowering.

The newly-created constant zero will need an extra register to hold it
in the current statepoint lowering implementation. Remove it if there
exists one.
  • Loading branch information
linzj authored and arsenm committed Apr 5, 2020
1 parent 8aadb44 commit a58c8a7
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
17 changes: 6 additions & 11 deletions llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
Expand Up @@ -804,22 +804,17 @@ SelectionDAGBuilder::LowerStatepoint(ImmutableStatepoint ISP,
#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);
Expand Down
23 changes: 23 additions & 0 deletions 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)

0 comments on commit a58c8a7

Please sign in to comment.