[llvm] 3ed58d4 - AArch64: allocate small fixed args properly in varargs functions.

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 18 03:35:30 PST 2023


Author: Tim Northover
Date: 2023-01-18T11:35:24Z
New Revision: 3ed58d4df65e00b0ed3679551394f794170233d0

URL: https://github.com/llvm/llvm-project/commit/3ed58d4df65e00b0ed3679551394f794170233d0
DIFF: https://github.com/llvm/llvm-project/commit/3ed58d4df65e00b0ed3679551394f794170233d0.diff

LOG: AArch64: allocate small fixed args properly in varargs functions.

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.

Added: 
    llvm/test/CodeGen/AArch64/varargs-fixed-i16.ll

Modified: 
    llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
    llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp

Removed: 
    


################################################################################
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
+}


        


More information about the llvm-commits mailing list