diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp --- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -164,8 +164,8 @@ struct OutgoingArgHandler : public CallLowering::OutgoingValueHandler { OutgoingArgHandler(MachineIRBuilder &MIRBuilder, MachineRegisterInfo &MRI, MachineInstrBuilder MIB, CCAssignFn *AssignFn, - CCAssignFn *AssignFnVarArg, bool IsVarArg, - bool IsTailCall = false, int FPDiff = 0) + CCAssignFn *AssignFnVarArg, bool IsTailCall = false, + int FPDiff = 0) : OutgoingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB), AssignFnVarArg(AssignFnVarArg), IsTailCall(IsTailCall), FPDiff(FPDiff), StackSize(0), SPReg(0) { @@ -173,7 +173,7 @@ const auto &Subtarget = MF.getSubtarget(); bool IsWin = Subtarget.isCallingConvWin64(MF.getFunction().getCallingConv()); - UseVarArgsCCForFixed = IsVarArg && IsWin; + UseVarArgsCCForFixed = IsWin; } Register getStackAddress(uint64_t Size, int64_t Offset, @@ -246,7 +246,7 @@ ISD::ArgFlagsTy Flags, CCState &State) override { bool Res; - if (Info.IsFixed && !UseVarArgsCCForFixed) + if (Info.IsFixed && (!UseVarArgsCCForFixed || !State.isVarArg())) Res = AssignFn(ValNo, ValVT, LocVT, LocInfo, Flags, State); else Res = AssignFnVarArg(ValNo, ValVT, LocVT, LocInfo, Flags, State); @@ -383,8 +383,7 @@ splitToValueTypes(CurArgInfo, SplitArgs, DL, CC); } - OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFn, AssignFn, - F.isVarArg()); + OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFn, AssignFn); Success = handleAssignments(MIRBuilder, SplitArgs, Handler, CC, F.isVarArg()); } @@ -887,7 +886,7 @@ // Do the actual argument marshalling. OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFnFixed, - AssignFnVarArg, Info.IsVarArg, true, FPDiff); + AssignFnVarArg, true, FPDiff); if (!handleAssignments(MIRBuilder, OutArgs, Handler, CalleeCC, Info.IsVarArg)) return false; @@ -999,7 +998,7 @@ // Do the actual argument marshalling. OutgoingArgHandler Handler(MIRBuilder, MRI, MIB, AssignFnFixed, - AssignFnVarArg, Info.IsVarArg, false); + AssignFnVarArg, false); if (!handleAssignments(MIRBuilder, OutArgs, Handler, Info.CallConv, Info.IsVarArg)) return false; diff --git a/llvm/test/CodeGen/AArch64/win64_vararg_float.ll b/llvm/test/CodeGen/AArch64/win64_vararg_float.ll --- a/llvm/test/CodeGen/AArch64/win64_vararg_float.ll +++ b/llvm/test/CodeGen/AArch64/win64_vararg_float.ll @@ -101,8 +101,22 @@ ; GISEL: fmov d0, #3.00000000 ; CHECK: mov w3, #4 ; CHECK: b other_d_va_fn - tail call void (double, i32, ...) @other_d_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4) #4 + tail call void (double, i32, ...) @other_d_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4) ret void } declare dso_local void @other_d_va_fn(double, i32, ...) + +define void @call_d_non_va() nounwind { +entry: +; CHECK-LABEL: call_d_non_va: +; CHECK-DAG: fmov d0, #1.00000000 +; CHECK-DAG: fmov d1, #3.00000000 +; CHECK-DAG: mov w0, #2 +; CHECK-DAG: mov w1, #4 +; CHECK: b other_d_non_va_fn + tail call void (double, i32, double, i32) @other_d_non_va_fn(double 1.000000e+00, i32 2, double 3.000000e+00, i32 4) + ret void +} + +declare dso_local void @other_d_non_va_fn(double, i32, double, i32)