diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 9305a65b5a0ad..d8a3738df505f 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -6856,7 +6856,9 @@ static void analyzeCallOperands(const AArch64TargetLowering &TLI, } 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, diff --git a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp index 1354364e5752f..e20b0f4a9e3f4 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -115,13 +115,12 @@ struct AArch64OutgoingValueAssigner 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(); diff --git a/llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll b/llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll new file mode 100644 index 0000000000000..8605e0fa8e3ab --- /dev/null +++ b/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 +}