[llvm] [Aarch64] [ISel] Don't save vaargs registers if vaargs are unused (PR #126780)
Pavel Skripkin via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 25 09:48:08 PST 2025
https://github.com/pskrgag updated https://github.com/llvm/llvm-project/pull/126780
>From a84fa9811d60afdec20ebf650f52b72dd29007e0 Mon Sep 17 00:00:00 2001
From: Pavel Skripkin <paskripkin at gmail.com>
Date: Tue, 11 Feb 2025 21:44:37 +0300
Subject: [PATCH 1/2] arm64: don't save vaargs regs if there is no va_start
---
.../lib/Target/AArch64/AArch64ISelLowering.cpp | 2 +-
.../AArch64/GlobalISel/aapcs_vararg_frame.ll | 18 ++++--------------
llvm/test/CodeGen/AArch64/alloca.ll | 13 +++++++------
.../AArch64/arm64ec-hybrid-patchable.ll | 4 ----
llvm/test/CodeGen/AArch64/darwinpcs-tail.ll | 4 ++--
llvm/test/CodeGen/AArch64/vararg-tallcall.ll | 6 ++++--
llvm/test/CodeGen/AArch64/win64_vararg2.ll | 11 ++++-------
7 files changed, 22 insertions(+), 36 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 34464d317beaf..5103374e14d80 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -8189,7 +8189,7 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
}
// varargs
- if (isVarArg) {
+ if (isVarArg && DAG.getMachineFunction().getFrameInfo().hasVAStart()) {
if (!Subtarget->isTargetDarwin() || IsWin64) {
// The AAPCS variadic function ABI is identical to the non-variadic
// one. As a result there may be more arguments in registers and we should
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll b/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
index 7892e892a2412..ddc4347950b27 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
@@ -3,22 +3,12 @@
; RUN: llc < %s --global-isel=1 -mtriple=aarch64-linux-gnu -mattr=+fp-armv8 | FileCheck %s --check-prefix=GISEL
define void @va(i32 %count, half %f, ...) nounwind {
-; CHECK-LABEL: va:
-; CHECK: // %bb.0: // %entry
-; CHECK-NEXT: sub sp, sp, #176
-; CHECK-NEXT: stp x2, x3, [sp, #128]
-; CHECK-NEXT: str x1, [sp, #120]
-; CHECK-NEXT: stp x4, x5, [sp, #144]
-; CHECK-NEXT: stp x6, x7, [sp, #160]
-; CHECK-NEXT: stp q1, q2, [sp]
-; CHECK-NEXT: stp q3, q4, [sp, #32]
-; CHECK-NEXT: stp q5, q6, [sp, #64]
-; CHECK-NEXT: str q7, [sp, #96]
-; CHECK-NEXT: add sp, sp, #176
+; CHECK-LABEL: va: // @va
+; CHECK: // %bb.0: // %entry
; CHECK-NEXT: ret
;
-; GISEL-LABEL: va:
-; GISEL: // %bb.0: // %entry
+; GISEL-LABEL: va: // @va
+; GISEL: // %bb.0: // %entry
; GISEL-NEXT: sub sp, sp, #176
; GISEL-NEXT: stp x1, x2, [sp, #120]
; GISEL-NEXT: stp x3, x4, [sp, #136]
diff --git a/llvm/test/CodeGen/AArch64/alloca.ll b/llvm/test/CodeGen/AArch64/alloca.ll
index ca3a500d79f32..76b50d62ab600 100644
--- a/llvm/test/CodeGen/AArch64/alloca.ll
+++ b/llvm/test/CodeGen/AArch64/alloca.ll
@@ -82,21 +82,22 @@ define void @test_variadic_alloca(i64 %n, ...) {
; [...]
; CHECK-DAG: stp q0, q1, [x29, #-192]
-; CHECK-DAG: stp x5, x6, [x29, #-24]
+; CHECK-DAG: stp x5, x6, [x29, #-32]
; [...]
-; CHECK-DAG: stp x1, x2, [x29, #-56]
+; CHECK-DAG: stp x1, x2, [x29, #-64]
; CHECK-NOFP-ARM64: stp x29, x30, [sp, #-16]!
; CHECK-NOFP-ARM64: mov x29, sp
; CHECK-NOFP-ARM64: sub sp, sp, #64
-; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-24]
+; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-32]
; [...]
-; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-40]
+; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-48]
; [...]
-; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-56]
+; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-64]
; [...]
; CHECK-NOFP-ARM64: mov x8, sp
-
+ %valist = alloca i8
+ call void @llvm.va_start(ptr %valist)
%addr = alloca i8, i64 %n
call void @use_addr(ptr %addr)
diff --git a/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll b/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
index 1ed6a273338ab..9e2633f3f63ea 100644
--- a/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
+++ b/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
@@ -24,10 +24,6 @@ define void @has_varargs(...) hybrid_patchable nounwind {
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: "#has_varargs$hp_target": // @"#has_varargs$hp_target"
; CHECK-NEXT: // %bb.0:
-; CHECK-NEXT: sub sp, sp, #32
-; CHECK-NEXT: stp x0, x1, [x4, #-32]
-; CHECK-NEXT: stp x2, x3, [x4, #-16]
-; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: ret
ret void
}
diff --git a/llvm/test/CodeGen/AArch64/darwinpcs-tail.ll b/llvm/test/CodeGen/AArch64/darwinpcs-tail.ll
index 5d3c755d0d73d..da176894c48a9 100644
--- a/llvm/test/CodeGen/AArch64/darwinpcs-tail.ll
+++ b/llvm/test/CodeGen/AArch64/darwinpcs-tail.ll
@@ -8,8 +8,8 @@
; CHECK-LABEL: _tailTest:
; CHECK: b __ZN1C3addEPKcz
; CHECK-LABEL: __ZThn8_N1C1fEiiiiiiiiiz:
-; CHECK: ldr w9, [sp, #4]
-; CHECK: str w9, [sp, #4]
+; CHECK: ldr w8, [sp, #4]
+; CHECK: str w8, [sp, #4]
; CHECK: b __ZN1C1fEiiiiiiiiiz
%class.C = type { %class.A.base, [4 x i8], %class.B.base, [4 x i8] }
diff --git a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
index 812837639196e..6abe33ac6816e 100644
--- a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
+++ b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
@@ -14,6 +14,8 @@ $"??_9B@@$BA at AA" = comdat any
; Function Attrs: noinline optnone
define linkonce_odr void @"??_9B@@$BA at AA"(ptr %this, ...) #1 comdat align 2 {
entry:
+ %valist = alloca i8
+ call void @llvm.va_start.p0(ptr %valist)
%this.addr = alloca ptr, align 8
store ptr %this, ptr %this.addr, align 8
%this1 = load ptr, ptr %this.addr, align 8
@@ -37,6 +39,6 @@ attributes #1 = { noinline optnone "thunk" }
; CHECK-EC: ldr x9, [x0]
; CHECK-EC: ldr x11, [x9]
; CHECK-EC: mov v0.16b, v7.16b
-; CHECK-EC: add x4, sp, #64
-; CHECK-EC: add sp, sp, #64
+; CHECK-EC: add x4, sp, #80
+; CHECK-EC: add sp, sp, #80
; CHECK-EC: br x11
diff --git a/llvm/test/CodeGen/AArch64/win64_vararg2.ll b/llvm/test/CodeGen/AArch64/win64_vararg2.ll
index dff49148fb772..27d7d4786e4df 100644
--- a/llvm/test/CodeGen/AArch64/win64_vararg2.ll
+++ b/llvm/test/CodeGen/AArch64/win64_vararg2.ll
@@ -7,17 +7,14 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; CHECK-LABEL: va_func:
; CHECK: .seh_proc va_func
; CHECK-NEXT: // %bb.0:
-; CHECK-NEXT: sub sp, sp, #80
-; CHECK-NEXT: .seh_stackalloc 80
+; CHECK-NEXT: sub sp, sp, #32
+; CHECK-NEXT: .seh_stackalloc 32
; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
; CHECK-NEXT: .seh_save_reg x19, 16
; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
; CHECK-NEXT: .seh_save_reg x30, 24
; CHECK-NEXT: .seh_endprologue
; CHECK-NEXT: mov w19, w0
-; CHECK-NEXT: stp x3, x4, [sp, #40]
-; CHECK-NEXT: stp x5, x6, [sp, #56]
-; CHECK-NEXT: str x7, [sp, #72]
; CHECK-NEXT: str w0, [sp, #12]
; CHECK-NEXT: strb w1, [sp, #11]
; CHECK-NEXT: strb w2, [sp, #10]
@@ -29,8 +26,8 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; CHECK-NEXT: .seh_save_reg x30, 24
; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
; CHECK-NEXT: .seh_save_reg x19, 16
-; CHECK-NEXT: add sp, sp, #80
-; CHECK-NEXT: .seh_stackalloc 80
+; CHECK-NEXT: add sp, sp, #32
+; CHECK-NEXT: .seh_stackalloc 32
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
>From 72ce44eb14f9a1b7c95ef45e22f1cc42ae542895 Mon Sep 17 00:00:00 2001
From: Pavel Skripkin <paskripkin at gmail.com>
Date: Tue, 25 Feb 2025 20:47:18 +0300
Subject: [PATCH 2/2] address review comments
---
.../AArch64/GlobalISel/aapcs_vararg_frame.ll | 62 +++++++++++++++--
llvm/test/CodeGen/AArch64/alloca.ll | 23 ++++---
.../AArch64/arm64ec-hybrid-patchable.ll | 9 +++
llvm/test/CodeGen/AArch64/vararg-tallcall.ll | 10 ++-
llvm/test/CodeGen/AArch64/win64_vararg2.ll | 68 +++++++++++--------
5 files changed, 127 insertions(+), 45 deletions(-)
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll b/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
index ddc4347950b27..6ea520ddcd6cd 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll
@@ -2,13 +2,15 @@
; RUN: llc < %s --global-isel=0 -mtriple=aarch64-linux-gnu -mattr=+fp-armv8 | FileCheck %s
; RUN: llc < %s --global-isel=1 -mtriple=aarch64-linux-gnu -mattr=+fp-armv8 | FileCheck %s --check-prefix=GISEL
+%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
+
define void @va(i32 %count, half %f, ...) nounwind {
-; CHECK-LABEL: va: // @va
-; CHECK: // %bb.0: // %entry
+; CHECK-LABEL: va:
+; CHECK: // %bb.0: // %entry
; CHECK-NEXT: ret
;
-; GISEL-LABEL: va: // @va
-; GISEL: // %bb.0: // %entry
+; GISEL-LABEL: va:
+; GISEL: // %bb.0: // %entry
; GISEL-NEXT: sub sp, sp, #176
; GISEL-NEXT: stp x1, x2, [sp, #120]
; GISEL-NEXT: stp x3, x4, [sp, #136]
@@ -23,3 +25,55 @@ define void @va(i32 %count, half %f, ...) nounwind {
entry:
ret void
}
+
+define void @va_used(i32 %count, half %f, ...) nounwind {
+; CHECK-LABEL: va_used:
+; CHECK: // %bb.0:
+; CHECK-NEXT: sub sp, sp, #208
+; CHECK-NEXT: mov x8, #-56 // =0xffffffffffffffc8
+; CHECK-NEXT: mov x9, sp
+; CHECK-NEXT: add x10, sp, #120
+; CHECK-NEXT: movk x8, #65424, lsl #32
+; CHECK-NEXT: add x9, x9, #112
+; CHECK-NEXT: stp x2, x3, [sp, #128]
+; CHECK-NEXT: stp x9, x8, [sp, #192]
+; CHECK-NEXT: add x8, x10, #56
+; CHECK-NEXT: add x9, sp, #208
+; CHECK-NEXT: str x1, [sp, #120]
+; CHECK-NEXT: stp x4, x5, [sp, #144]
+; CHECK-NEXT: stp x6, x7, [sp, #160]
+; CHECK-NEXT: stp q1, q2, [sp]
+; CHECK-NEXT: stp q3, q4, [sp, #32]
+; CHECK-NEXT: stp q5, q6, [sp, #64]
+; CHECK-NEXT: str q7, [sp, #96]
+; CHECK-NEXT: stp x9, x8, [sp, #176]
+; CHECK-NEXT: add sp, sp, #208
+; CHECK-NEXT: ret
+;
+; GISEL-LABEL: va_used:
+; GISEL: // %bb.0:
+; GISEL-NEXT: sub sp, sp, #208
+; GISEL-NEXT: mov x8, sp
+; GISEL-NEXT: add x9, sp, #208
+; GISEL-NEXT: add x10, sp, #208
+; GISEL-NEXT: stp x9, x10, [x8]
+; GISEL-NEXT: add x9, sp, #144
+; GISEL-NEXT: mov w10, #-112 // =0xffffff90
+; GISEL-NEXT: str x9, [x8, #16]
+; GISEL-NEXT: mov w9, #-56 // =0xffffffc8
+; GISEL-NEXT: stp x1, x2, [sp, #152]
+; GISEL-NEXT: stp x3, x4, [sp, #168]
+; GISEL-NEXT: stp x5, x6, [sp, #184]
+; GISEL-NEXT: str x7, [sp, #200]
+; GISEL-NEXT: stp q1, q2, [sp, #32]
+; GISEL-NEXT: stp q3, q4, [sp, #64]
+; GISEL-NEXT: stp q5, q6, [sp, #96]
+; GISEL-NEXT: str q7, [sp, #128]
+; GISEL-NEXT: stp w9, w10, [x8, #24]
+; GISEL-NEXT: add sp, sp, #208
+; GISEL-NEXT: ret
+ %valist = alloca %struct.__va_list
+ call void @llvm.va_start(ptr %valist)
+ call void @llvm.va_end(ptr %valist)
+ ret void
+}
diff --git a/llvm/test/CodeGen/AArch64/alloca.ll b/llvm/test/CodeGen/AArch64/alloca.ll
index 76b50d62ab600..119b84e352c74 100644
--- a/llvm/test/CodeGen/AArch64/alloca.ll
+++ b/llvm/test/CodeGen/AArch64/alloca.ll
@@ -62,6 +62,8 @@ define i64 @test_alloca_with_local(i64 %n) {
; CHECK: ret
}
+%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
+
define void @test_variadic_alloca(i64 %n, ...) {
; CHECK-LABEL: test_variadic_alloca:
@@ -77,32 +79,33 @@ define void @test_variadic_alloca(i64 %n, ...) {
; CHECK: stp x29, x30, [sp, #-16]!
; CHECK: mov x29, sp
-; CHECK: sub sp, sp, #192
-; CHECK-DAG: stp q6, q7, [x29, #-96]
+; CHECK: sub sp, sp, #224
+; CHECK-DAG: stp q6, q7, [x29, #-128]
; [...]
-; CHECK-DAG: stp q0, q1, [x29, #-192]
+; CHECK-DAG: stp q2, q3, [x29, #-192]
-; CHECK-DAG: stp x5, x6, [x29, #-32]
+; CHECK-DAG: stp x5, x6, [x29, #-56]
; [...]
-; CHECK-DAG: stp x1, x2, [x29, #-64]
+; CHECK-DAG: stp x1, x2, [x29, #-88]
; CHECK-NOFP-ARM64: stp x29, x30, [sp, #-16]!
; CHECK-NOFP-ARM64: mov x29, sp
-; CHECK-NOFP-ARM64: sub sp, sp, #64
-; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-32]
+; CHECK-NOFP-ARM64: sub sp, sp, #16
+; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-56]
; [...]
-; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-48]
+; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-72]
; [...]
-; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-64]
+; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-88]
; [...]
; CHECK-NOFP-ARM64: mov x8, sp
- %valist = alloca i8
+ %valist = alloca %struct.__va_list
call void @llvm.va_start(ptr %valist)
%addr = alloca i8, i64 %n
call void @use_addr(ptr %addr)
; CHECK: bl use_addr
+ call void @llvm.va_end(ptr %valist)
ret void
; CHECK-NOFP-AARCH64: sub sp, x29, #64
diff --git a/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll b/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
index 9e2633f3f63ea..be2cd8a7617a7 100644
--- a/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
+++ b/llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll
@@ -16,6 +16,8 @@ define dso_local ptr @func() hybrid_patchable nounwind {
ret ptr @func
}
+%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
+
define void @has_varargs(...) hybrid_patchable nounwind {
; SYM: [11](sec 5)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 #has_varargs$hp_target
; CHECK-LABEL: .def "#has_varargs$hp_target";
@@ -24,7 +26,14 @@ define void @has_varargs(...) hybrid_patchable nounwind {
; CHECK-NEXT: .p2align 2
; CHECK-NEXT: "#has_varargs$hp_target": // @"#has_varargs$hp_target"
; CHECK-NEXT: // %bb.0:
+; CHECK-NEXT: sub sp, sp, #64
+; CHECK-NEXT: stp x0, x1, [x4, #-32]!
+; CHECK-NEXT: stp x2, x3, [x4, #16]
+; CHECK-NEXT: str x4, [sp], #64
; CHECK-NEXT: ret
+ %valist = alloca %struct.__va_list
+ call void @llvm.va_start(ptr %valist)
+ call void @llvm.va_end(ptr %valist)
ret void
}
diff --git a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
index 6abe33ac6816e..7ee76c8ad50a2 100644
--- a/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
+++ b/llvm/test/CodeGen/AArch64/vararg-tallcall.ll
@@ -8,13 +8,14 @@ target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"
%class.X = type { i8 }
%struct.B = type { ptr }
+%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
$"??_9B@@$BA at AA" = comdat any
; Function Attrs: noinline optnone
define linkonce_odr void @"??_9B@@$BA at AA"(ptr %this, ...) #1 comdat align 2 {
entry:
- %valist = alloca i8
+ %valist = alloca %struct.__va_list
call void @llvm.va_start.p0(ptr %valist)
%this.addr = alloca ptr, align 8
store ptr %this, ptr %this.addr, align 8
@@ -22,6 +23,7 @@ entry:
call void asm sideeffect "", "~{d0}"()
%vtable = load ptr, ptr %this1, align 8
%0 = load ptr, ptr %vtable, align 8
+ call void @llvm.va_end.p0(ptr %valist)
musttail call void (ptr, ...) %0(ptr %this1, ...)
ret void
; No predecessors!
@@ -38,7 +40,9 @@ attributes #1 = { noinline optnone "thunk" }
; CHECK-EC: mov v7.16b, v0.16b
; CHECK-EC: ldr x9, [x0]
; CHECK-EC: ldr x11, [x9]
+; CHECH-EC: add x4, sp, #96
; CHECK-EC: mov v0.16b, v7.16b
-; CHECK-EC: add x4, sp, #80
-; CHECK-EC: add sp, sp, #80
+; CHECK-EC: add x4, sp, #96
+; CHECK-EC: ldr x30, [sp, #48]
+; CHECK-EC: add sp, sp, #96
; CHECK-EC: br x11
diff --git a/llvm/test/CodeGen/AArch64/win64_vararg2.ll b/llvm/test/CodeGen/AArch64/win64_vararg2.ll
index 27d7d4786e4df..f17fe2408c6d1 100644
--- a/llvm/test/CodeGen/AArch64/win64_vararg2.ll
+++ b/llvm/test/CodeGen/AArch64/win64_vararg2.ll
@@ -1,20 +1,27 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=aarch64-pc-win32 | FileCheck %s
-; RUN: llc < %s -global-isel -mtriple=aarch64-pc-win32 | FileCheck %s --check-prefix=GISEL
+; RUN: llc < %s -global-isel -mtriple=aarch64-pc-win32 -global-isel-abort=0 | FileCheck %s --check-prefix=GISEL
+
+%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
; Function Attrs: mustprogress noinline nounwind optnone uwtable
define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; CHECK-LABEL: va_func:
; CHECK: .seh_proc va_func
; CHECK-NEXT: // %bb.0:
-; CHECK-NEXT: sub sp, sp, #32
-; CHECK-NEXT: .seh_stackalloc 32
-; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
-; CHECK-NEXT: .seh_save_reg x19, 16
-; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
-; CHECK-NEXT: .seh_save_reg x30, 24
+; CHECK-NEXT: sub sp, sp, #112
+; CHECK-NEXT: .seh_stackalloc 112
+; CHECK-NEXT: str x19, [sp, #48] // 8-byte Folded Spill
+; CHECK-NEXT: .seh_save_reg x19, 48
+; CHECK-NEXT: str x30, [sp, #56] // 8-byte Folded Spill
+; CHECK-NEXT: .seh_save_reg x30, 56
; CHECK-NEXT: .seh_endprologue
+; CHECK-NEXT: add x8, sp, #72
; CHECK-NEXT: mov w19, w0
+; CHECK-NEXT: stp x3, x4, [sp, #72]
+; CHECK-NEXT: stp x5, x6, [sp, #88]
+; CHECK-NEXT: str x7, [sp, #104]
+; CHECK-NEXT: str x8, [sp, #16]
; CHECK-NEXT: str w0, [sp, #12]
; CHECK-NEXT: strb w1, [sp, #11]
; CHECK-NEXT: strb w2, [sp, #10]
@@ -22,12 +29,12 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; CHECK-NEXT: cmp w19, w0
; CHECK-NEXT: cset w0, ls
; CHECK-NEXT: .seh_startepilogue
-; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
-; CHECK-NEXT: .seh_save_reg x30, 24
-; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
-; CHECK-NEXT: .seh_save_reg x19, 16
-; CHECK-NEXT: add sp, sp, #32
-; CHECK-NEXT: .seh_stackalloc 32
+; CHECK-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload
+; CHECK-NEXT: .seh_save_reg x30, 56
+; CHECK-NEXT: ldr x19, [sp, #48] // 8-byte Folded Reload
+; CHECK-NEXT: .seh_save_reg x19, 48
+; CHECK-NEXT: add sp, sp, #112
+; CHECK-NEXT: .seh_stackalloc 112
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
@@ -36,17 +43,19 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; GISEL-LABEL: va_func:
; GISEL: .seh_proc va_func
; GISEL-NEXT: // %bb.0:
-; GISEL-NEXT: sub sp, sp, #80
-; GISEL-NEXT: .seh_stackalloc 80
-; GISEL-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
-; GISEL-NEXT: .seh_save_reg x19, 16
-; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
-; GISEL-NEXT: .seh_save_reg x30, 24
+; GISEL-NEXT: sub sp, sp, #112
+; GISEL-NEXT: .seh_stackalloc 112
+; GISEL-NEXT: str x19, [sp, #48] // 8-byte Folded Spill
+; GISEL-NEXT: .seh_save_reg x19, 48
+; GISEL-NEXT: str x30, [sp, #56] // 8-byte Folded Spill
+; GISEL-NEXT: .seh_save_reg x30, 56
; GISEL-NEXT: .seh_endprologue
-; GISEL-NEXT: stp x3, x4, [sp, #40]
+; GISEL-NEXT: add x8, sp, #72
; GISEL-NEXT: mov w19, w0
-; GISEL-NEXT: stp x5, x6, [sp, #56]
-; GISEL-NEXT: str x7, [sp, #72]
+; GISEL-NEXT: stp x3, x4, [sp, #72]
+; GISEL-NEXT: stp x5, x6, [sp, #88]
+; GISEL-NEXT: str x7, [sp, #104]
+; GISEL-NEXT: str x8, [sp, #16]
; GISEL-NEXT: str w0, [sp, #12]
; GISEL-NEXT: strb w1, [sp, #11]
; GISEL-NEXT: strb w2, [sp, #10]
@@ -54,16 +63,18 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
; GISEL-NEXT: cmp w19, w0
; GISEL-NEXT: cset w0, ls
; GISEL-NEXT: .seh_startepilogue
-; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
-; GISEL-NEXT: .seh_save_reg x30, 24
-; GISEL-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
-; GISEL-NEXT: .seh_save_reg x19, 16
-; GISEL-NEXT: add sp, sp, #80
-; GISEL-NEXT: .seh_stackalloc 80
+; GISEL-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload
+; GISEL-NEXT: .seh_save_reg x30, 56
+; GISEL-NEXT: ldr x19, [sp, #48] // 8-byte Folded Reload
+; GISEL-NEXT: .seh_save_reg x19, 48
+; GISEL-NEXT: add sp, sp, #112
+; GISEL-NEXT: .seh_stackalloc 112
; GISEL-NEXT: .seh_endepilogue
; GISEL-NEXT: ret
; GISEL-NEXT: .seh_endfunclet
; GISEL-NEXT: .seh_endproc
+ %valist = alloca %struct.__va_list
+ call void @llvm.va_start(ptr %valist)
%a_alloc = alloca i32, align 4
%b_alloc = alloca i8, align 1
%c_alloc = alloca i8, align 1
@@ -73,6 +84,7 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
%a_load = load i32, ptr %a_alloc, align 4
%ret = call noundef i32 @other()
%cmp = icmp ule i32 %a_load, %ret
+ call void @llvm.va_end(ptr %valist)
ret i1 %cmp
}
More information about the llvm-commits
mailing list