Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -6916,7 +6916,9 @@ } else { UseVarArgCC = !Outs[i].IsFixed; } - } else { + } + + if (!UseVarArgCC) { // Get type of the original argument. EVT ActualVT = TLI.getValueType(DAG.getDataLayout(), CLI.Args[Outs[i].OrigArgIndex].Ty, Index: llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -115,13 +115,12 @@ bool IsCalleeWin = Subtarget.isCallingConvWin64(State.getCallingConv()); bool UseVarArgsCCForFixed = IsCalleeWin && State.isVarArg(); - if (!State.isVarArg() && !UseVarArgsCCForFixed && !IsReturn) - applyStackPassedSmallTypeDAGHack(OrigVT, ValVT, LocVT); - bool Res; - if (Info.IsFixed && !UseVarArgsCCForFixed) + if (Info.IsFixed && !UseVarArgsCCForFixed) { + if (!IsReturn) + applyStackPassedSmallTypeDAGHack(OrigVT, ValVT, LocVT); Res = AssignFn(ValNo, ValVT, LocVT, LocInfo, Flags, State); - else + } else Res = AssignFnVarArg(ValNo, ValVT, LocVT, LocInfo, Flags, State); StackOffset = State.getNextStackOffset(); Index: llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll @@ -0,0 +1,23 @@ +; RUN: llc -mtriple=arm64-apple-macosx %s -o - | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc -mtriple=arm64-apple-macosx %s -o - -global-isel | FileCheck %s --check-prefix=CHECK-DARWIN +; RUN: llc -mtriple=aarch64-linux-gnu %s -o - | FileCheck %s --check-prefix=CHECK-LINWIN +; RUN: llc -mtriple=aarch64-linux-gnu %s -o - -global-isel | FileCheck %s --check-prefix=CHECK-LINWIN +; RUN: llc -mtriple=aarch64-windows-msvc %s -o - | FileCheck %s --check-prefix=CHECK-LINWIN +; RUN: llc -mtriple=aarch64-windows-msvc %s -o - -global-isel | FileCheck %s --check-prefix=CHECK-LINWIN + +declare i16 @foo([8 x i64], i16 signext, i16 signext %a, ...) + +define void @bar() { +; CHECK-DARWIN-LABEL: bar: +; CHECK-LINWIN-LABEL: bar: + +; CHECK-DARWIN: mov [[TMP:w[0-9]+]], #2752512 +; CHECK-DARWIN: str [[TMP]], [sp] + +; CHECK-LINWIN: mov [[TMP:w[0-9]+]], #42 +; CHECK-LINWIN: str{{h?}} wzr, [sp] +; CHECK-LINWIN: str{{h?}} [[TMP]], [sp, #8] + + call i16([8 x i64], i16, i16, ...) @foo([8 x i64] poison, i16 signext 0, i16 signext 42) + ret void +}