diff --git a/llvm/lib/Target/ARM/ARMCallLowering.cpp b/llvm/lib/Target/ARM/ARMCallLowering.cpp --- a/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -538,22 +538,18 @@ MIB.addRegMask(TRI->getCallPreservedMask(MF, Info.CallConv)); - bool IsVarArg = false; SmallVector ArgInfos; for (auto Arg : Info.OrigArgs) { if (!isSupportedType(DL, TLI, Arg.Ty)) return false; - if (!Arg.IsFixed) - IsVarArg = true; - if (Arg.Flags[0].isByVal()) return false; splitToValueTypes(Arg, ArgInfos, MF); } - auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, IsVarArg); + auto ArgAssignFn = TLI.CCAssignFnForCall(Info.CallConv, Info.IsVarArg); ARMOutgoingValueHandler ArgHandler(MIRBuilder, MRI, MIB, ArgAssignFn); if (!handleAssignments(MIRBuilder, ArgInfos, ArgHandler)) return false; @@ -567,7 +563,7 @@ ArgInfos.clear(); splitToValueTypes(Info.OrigRet, ArgInfos, MF); - auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, IsVarArg); + auto RetAssignFn = TLI.CCAssignFnForReturn(Info.CallConv, Info.IsVarArg); CallReturnHandler RetHandler(MIRBuilder, MRI, MIB, RetAssignFn); if (!handleAssignments(MIRBuilder, ArgInfos, RetHandler)) return false; diff --git a/llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll b/llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll --- a/llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll +++ b/llvm/test/CodeGen/ARM/GlobalISel/irtranslator-varargs-lowering.ll @@ -59,6 +59,27 @@ ret float %r } +define arm_aapcs_vfpcc float @test_call_to_varargs_with_floats_fixed_args_only(float %a, double %b) { +; CHECK-LABEL: name: test_call_to_varargs_with_floats_fixed_args_only +; CHECK-DAG: [[AVREG:%[0-9]+]]:_(s32) = COPY $s0 +; CHECK-DAG: [[BVREG:%[0-9]+]]:_(s64) = COPY $d1 +; CHECK: ADJCALLSTACKDOWN 0, 0, 14 /* CC::al */, $noreg, implicit-def $sp, implicit $sp +; CHECK-DAG: $r0 = COPY [[AVREG]] +; CHECK-DAG: [[B1:%[0-9]+]]:_(s32), [[B2:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[BVREG]](s64) +; CHECK-DAG: $r2 = COPY [[B1]] +; CHECK-DAG: $r3 = COPY [[B2]] +; ARM: BL @float_varargs_target, csr_aapcs, implicit-def $lr, implicit $sp, implicit $r0, implicit $r2, implicit $r3, implicit-def $r0 +; THUMB: tBL 14 /* CC::al */, $noreg, @float_varargs_target, csr_aapcs, implicit-def $lr, implicit $sp, implicit $r0, implicit $r2, implicit $r3, implicit-def $r0 +; CHECK: [[RVREG:%[0-9]+]]:_(s32) = COPY $r0 +; CHECK: ADJCALLSTACKUP 0, 0, 14 /* CC::al */, $noreg, implicit-def $sp, implicit $sp +; CHECK: $s0 = COPY [[RVREG]] +; ARM: BX_RET 14 /* CC::al */, $noreg, implicit $s0 +; THUMB: tBX_RET 14 /* CC::al */, $noreg, implicit $s0 +entry: + %r = notail call arm_aapcs_vfpcc float(float, double, ...) @float_varargs_target(float %a, double %b) + ret float %r +} + define arm_aapcs_vfpcc float @test_indirect_call_to_varargs(float (float, double, ...) *%fptr, float %a, double %b) { ; CHECK-LABEL: name: test_indirect_call_to_varargs ; CHECK-DAG: [[FPTRVREG:%[0-9]+]]:gpr(p0) = COPY $r0