[PATCH] D141370: AArch64: allocate small fixed args properly in varargs functions.
Tim Northover via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 10 03:57:51 PST 2023
t.p.northover created this revision.
Herald added subscribers: hiraditya, kristof.beyls, mcrosier.
Herald added a project: All.
t.p.northover requested review of this revision.
Herald added a project: LLVM.
Quite an embarrassing one here, vargargs calls have been broken in some edge-cases for quite a while...
On Darwin, function arguments occupy their real size when passed on the stack (e.g. an i16 only consumes 2 bytes). This means that, even for fixed args in varargs calls we need to keep track of the original type being passed before any DAG/GISel promotions. Existing logic only applied this fix to the non-varargs case leading to mismatch between caller & callee in those situations.
On Linux & Windows these arguments always occupy a 64-bit slot anyway so there's no special handling needed.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D141370
Files:
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp
llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll
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
+}
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/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,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141370.487741.patch
Type: text/x-patch
Size: 2724 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230110/00ceabe3/attachment.bin>
More information about the llvm-commits
mailing list