Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion llvm/include/llvm/CodeGen/TargetLowering.h
Original file line number Diff line number Diff line change
Expand Up @@ -4397,8 +4397,14 @@ class TargetLowering : public TargetLoweringBase {
}

CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultType,
SDValue Target, ArgListTy &&ArgsList) {
SDValue Target, ArgListTy &&ArgsList,
AttributeSet ResultAttrs = {}) {
RetTy = ResultType;
IsInReg = ResultAttrs.hasAttribute(Attribute::InReg);
RetSExt = ResultAttrs.hasAttribute(Attribute::SExt);
RetZExt = ResultAttrs.hasAttribute(Attribute::ZExt);
NoMerge = ResultAttrs.hasAttribute(Attribute::NoMerge);

Callee = Target;
CallConv = CC;
NumFixedArgs = ArgsList.size();
Expand Down
7 changes: 4 additions & 3 deletions llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9728,7 +9728,7 @@ SDValue SelectionDAGBuilder::lowerRangeToAssertZExt(SelectionDAG &DAG,
void SelectionDAGBuilder::populateCallLoweringInfo(
TargetLowering::CallLoweringInfo &CLI, const CallBase *Call,
unsigned ArgIdx, unsigned NumArgs, SDValue Callee, Type *ReturnTy,
bool IsPatchPoint) {
AttributeSet RetAttrs, bool IsPatchPoint) {
TargetLowering::ArgListTy Args;
Args.reserve(NumArgs);

Expand All @@ -9749,7 +9749,8 @@ void SelectionDAGBuilder::populateCallLoweringInfo(

CLI.setDebugLoc(getCurSDLoc())
.setChain(getRoot())
.setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args))
.setCallee(Call->getCallingConv(), ReturnTy, Callee, std::move(Args),
RetAttrs)
.setDiscardResult(Call->use_empty())
.setIsPatchPoint(IsPatchPoint)
.setIsPreallocated(
Expand Down Expand Up @@ -9898,7 +9899,7 @@ void SelectionDAGBuilder::visitPatchpoint(const CallBase &CB,

TargetLowering::CallLoweringInfo CLI(DAG);
populateCallLoweringInfo(CLI, &CB, NumMetaOpers, NumCallArgs, Callee,
ReturnTy, true);
ReturnTy, CB.getAttributes().getRetAttrs(), true);
std::pair<SDValue, SDValue> Result = lowerInvokable(CLI, EHPadBB);

SDNode *CallEnd = Result.second.getNode();
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,8 @@ class SelectionDAGBuilder {
void populateCallLoweringInfo(TargetLowering::CallLoweringInfo &CLI,
const CallBase *Call, unsigned ArgIdx,
unsigned NumArgs, SDValue Callee,
Type *ReturnTy, bool IsPatchPoint);
Type *ReturnTy, AttributeSet RetAttrs,
bool IsPatchPoint);

std::pair<SDValue, SDValue>
lowerInvokable(TargetLowering::CallLoweringInfo &CLI,
Expand Down
12 changes: 8 additions & 4 deletions llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1033,10 +1033,16 @@ SelectionDAGBuilder::LowerStatepoint(const GCStatepointInst &I,
ActualCallee = Callee;
}

const auto GCResultLocality = getGCResultLocality(I);
AttributeSet retAttrs;
if (GCResultLocality.first)
retAttrs = GCResultLocality.first->getAttributes().getRetAttrs();

StatepointLoweringInfo SI(DAG);
populateCallLoweringInfo(SI.CLI, &I, GCStatepointInst::CallArgsBeginPos,
I.getNumCallArgs(), ActualCallee,
I.getActualReturnType(), false /* IsPatchPoint */);
I.getActualReturnType(), retAttrs,
/*IsPatchPoint=*/false);

// There may be duplication in the gc.relocate list; such as two copies of
// each relocation on normal and exceptional path for an invoke. We only
Expand Down Expand Up @@ -1092,8 +1098,6 @@ SelectionDAGBuilder::LowerStatepoint(const GCStatepointInst &I,
SDValue ReturnValue = LowerAsSTATEPOINT(SI);

// Export the result value if needed
const auto GCResultLocality = getGCResultLocality(I);

if (!GCResultLocality.first && !GCResultLocality.second) {
// The return value is not needed, just generate a poison value.
// Note: This covers the void return case.
Expand Down Expand Up @@ -1138,7 +1142,7 @@ void SelectionDAGBuilder::LowerCallSiteWithDeoptBundleImpl(
populateCallLoweringInfo(
SI.CLI, Call, ArgBeginIndex, Call->arg_size(), Callee,
ForceVoidReturnTy ? Type::getVoidTy(*DAG.getContext()) : Call->getType(),
false);
Call->getAttributes().getRetAttrs(), /*IsPatchPoint=*/false);
if (!VarArgDisallowed)
SI.CLI.IsVarArg = Call->getFunctionType()->isVarArg();

Expand Down
3 changes: 0 additions & 3 deletions llvm/test/CodeGen/AArch64/statepoint-call-lowering.ll
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ define i1 @test_i1_return() gc "statepoint-example" {
; CHECK-NEXT: .cfi_offset w30, -16
; CHECK-NEXT: bl return_i1
; CHECK-NEXT: .Ltmp0:
; CHECK-NEXT: and w0, w0, #0x1
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
; This is just checking that a i1 gets lowered normally when there's no extra
Expand Down Expand Up @@ -106,7 +105,6 @@ define i1 @test_relocate(ptr addrspace(1) %a) gc "statepoint-example" {
; CHECK-NEXT: .cfi_offset w30, -16
; CHECK-NEXT: bl return_i1
; CHECK-NEXT: .Ltmp5:
; CHECK-NEXT: and w0, w0, #0x1
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
; Check that an ununsed relocate has no code-generation impact
Expand Down Expand Up @@ -145,7 +143,6 @@ define i1 @test_i1_return_patchable() gc "statepoint-example" {
; CHECK-NEXT: .cfi_offset w30, -16
; CHECK-NEXT: nop
; CHECK-NEXT: .Ltmp7:
; CHECK-NEXT: and w0, w0, #0x1
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: ret
; A patchable variant of test_i1_return
Expand Down
3 changes: 0 additions & 3 deletions llvm/test/CodeGen/X86/statepoint-call-lowering.ll
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,6 @@ define i8 @test_signext_return(ptr) gc "statepoint-example" {
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: callq signext_return_i1@PLT
; CHECK-NEXT: .Ltmp10:
; CHECK-NEXT: andb $1, %al
; CHECK-NEXT: negb %al
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
Expand All @@ -266,7 +264,6 @@ define i8 @test_zeroext_return() gc "statepoint-example" {
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: callq return_i1@PLT
; CHECK-NEXT: .Ltmp11:
; CHECK-NEXT: andb $1, %al
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
Expand Down