Skip to content

Commit 72ce44e

Browse files
committed
address review comments
1 parent a84fa98 commit 72ce44e

File tree

5 files changed

+127
-45
lines changed

5 files changed

+127
-45
lines changed

llvm/test/CodeGen/AArch64/GlobalISel/aapcs_vararg_frame.ll

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
; RUN: llc < %s --global-isel=0 -mtriple=aarch64-linux-gnu -mattr=+fp-armv8 | FileCheck %s
33
; RUN: llc < %s --global-isel=1 -mtriple=aarch64-linux-gnu -mattr=+fp-armv8 | FileCheck %s --check-prefix=GISEL
44

5+
%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
6+
57
define void @va(i32 %count, half %f, ...) nounwind {
6-
; CHECK-LABEL: va: // @va
7-
; CHECK: // %bb.0: // %entry
8+
; CHECK-LABEL: va:
9+
; CHECK: // %bb.0: // %entry
810
; CHECK-NEXT: ret
911
;
10-
; GISEL-LABEL: va: // @va
11-
; GISEL: // %bb.0: // %entry
12+
; GISEL-LABEL: va:
13+
; GISEL: // %bb.0: // %entry
1214
; GISEL-NEXT: sub sp, sp, #176
1315
; GISEL-NEXT: stp x1, x2, [sp, #120]
1416
; GISEL-NEXT: stp x3, x4, [sp, #136]
@@ -23,3 +25,55 @@ define void @va(i32 %count, half %f, ...) nounwind {
2325
entry:
2426
ret void
2527
}
28+
29+
define void @va_used(i32 %count, half %f, ...) nounwind {
30+
; CHECK-LABEL: va_used:
31+
; CHECK: // %bb.0:
32+
; CHECK-NEXT: sub sp, sp, #208
33+
; CHECK-NEXT: mov x8, #-56 // =0xffffffffffffffc8
34+
; CHECK-NEXT: mov x9, sp
35+
; CHECK-NEXT: add x10, sp, #120
36+
; CHECK-NEXT: movk x8, #65424, lsl #32
37+
; CHECK-NEXT: add x9, x9, #112
38+
; CHECK-NEXT: stp x2, x3, [sp, #128]
39+
; CHECK-NEXT: stp x9, x8, [sp, #192]
40+
; CHECK-NEXT: add x8, x10, #56
41+
; CHECK-NEXT: add x9, sp, #208
42+
; CHECK-NEXT: str x1, [sp, #120]
43+
; CHECK-NEXT: stp x4, x5, [sp, #144]
44+
; CHECK-NEXT: stp x6, x7, [sp, #160]
45+
; CHECK-NEXT: stp q1, q2, [sp]
46+
; CHECK-NEXT: stp q3, q4, [sp, #32]
47+
; CHECK-NEXT: stp q5, q6, [sp, #64]
48+
; CHECK-NEXT: str q7, [sp, #96]
49+
; CHECK-NEXT: stp x9, x8, [sp, #176]
50+
; CHECK-NEXT: add sp, sp, #208
51+
; CHECK-NEXT: ret
52+
;
53+
; GISEL-LABEL: va_used:
54+
; GISEL: // %bb.0:
55+
; GISEL-NEXT: sub sp, sp, #208
56+
; GISEL-NEXT: mov x8, sp
57+
; GISEL-NEXT: add x9, sp, #208
58+
; GISEL-NEXT: add x10, sp, #208
59+
; GISEL-NEXT: stp x9, x10, [x8]
60+
; GISEL-NEXT: add x9, sp, #144
61+
; GISEL-NEXT: mov w10, #-112 // =0xffffff90
62+
; GISEL-NEXT: str x9, [x8, #16]
63+
; GISEL-NEXT: mov w9, #-56 // =0xffffffc8
64+
; GISEL-NEXT: stp x1, x2, [sp, #152]
65+
; GISEL-NEXT: stp x3, x4, [sp, #168]
66+
; GISEL-NEXT: stp x5, x6, [sp, #184]
67+
; GISEL-NEXT: str x7, [sp, #200]
68+
; GISEL-NEXT: stp q1, q2, [sp, #32]
69+
; GISEL-NEXT: stp q3, q4, [sp, #64]
70+
; GISEL-NEXT: stp q5, q6, [sp, #96]
71+
; GISEL-NEXT: str q7, [sp, #128]
72+
; GISEL-NEXT: stp w9, w10, [x8, #24]
73+
; GISEL-NEXT: add sp, sp, #208
74+
; GISEL-NEXT: ret
75+
%valist = alloca %struct.__va_list
76+
call void @llvm.va_start(ptr %valist)
77+
call void @llvm.va_end(ptr %valist)
78+
ret void
79+
}

llvm/test/CodeGen/AArch64/alloca.ll

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ define i64 @test_alloca_with_local(i64 %n) {
6262
; CHECK: ret
6363
}
6464

65+
%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
66+
6567
define void @test_variadic_alloca(i64 %n, ...) {
6668
; CHECK-LABEL: test_variadic_alloca:
6769

@@ -77,32 +79,33 @@ define void @test_variadic_alloca(i64 %n, ...) {
7779

7880
; CHECK: stp x29, x30, [sp, #-16]!
7981
; CHECK: mov x29, sp
80-
; CHECK: sub sp, sp, #192
81-
; CHECK-DAG: stp q6, q7, [x29, #-96]
82+
; CHECK: sub sp, sp, #224
83+
; CHECK-DAG: stp q6, q7, [x29, #-128]
8284
; [...]
83-
; CHECK-DAG: stp q0, q1, [x29, #-192]
85+
; CHECK-DAG: stp q2, q3, [x29, #-192]
8486

85-
; CHECK-DAG: stp x5, x6, [x29, #-32]
87+
; CHECK-DAG: stp x5, x6, [x29, #-56]
8688
; [...]
87-
; CHECK-DAG: stp x1, x2, [x29, #-64]
89+
; CHECK-DAG: stp x1, x2, [x29, #-88]
8890

8991
; CHECK-NOFP-ARM64: stp x29, x30, [sp, #-16]!
9092
; CHECK-NOFP-ARM64: mov x29, sp
91-
; CHECK-NOFP-ARM64: sub sp, sp, #64
92-
; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-32]
93+
; CHECK-NOFP-ARM64: sub sp, sp, #16
94+
; CHECK-NOFP-ARM64-DAG: stp x5, x6, [x29, #-56]
9395
; [...]
94-
; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-48]
96+
; CHECK-NOFP-ARM64-DAG: stp x3, x4, [x29, #-72]
9597
; [...]
96-
; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-64]
98+
; CHECK-NOFP-ARM64-DAG: stp x1, x2, [x29, #-88]
9799
; [...]
98100
; CHECK-NOFP-ARM64: mov x8, sp
99-
%valist = alloca i8
101+
%valist = alloca %struct.__va_list
100102
call void @llvm.va_start(ptr %valist)
101103
%addr = alloca i8, i64 %n
102104

103105
call void @use_addr(ptr %addr)
104106
; CHECK: bl use_addr
105107

108+
call void @llvm.va_end(ptr %valist)
106109
ret void
107110

108111
; CHECK-NOFP-AARCH64: sub sp, x29, #64

llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ define dso_local ptr @func() hybrid_patchable nounwind {
1616
ret ptr @func
1717
}
1818

19+
%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
20+
1921
define void @has_varargs(...) hybrid_patchable nounwind {
2022
; SYM: [11](sec 5)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 #has_varargs$hp_target
2123
; CHECK-LABEL: .def "#has_varargs$hp_target";
@@ -24,7 +26,14 @@ define void @has_varargs(...) hybrid_patchable nounwind {
2426
; CHECK-NEXT: .p2align 2
2527
; CHECK-NEXT: "#has_varargs$hp_target": // @"#has_varargs$hp_target"
2628
; CHECK-NEXT: // %bb.0:
29+
; CHECK-NEXT: sub sp, sp, #64
30+
; CHECK-NEXT: stp x0, x1, [x4, #-32]!
31+
; CHECK-NEXT: stp x2, x3, [x4, #16]
32+
; CHECK-NEXT: str x4, [sp], #64
2733
; CHECK-NEXT: ret
34+
%valist = alloca %struct.__va_list
35+
call void @llvm.va_start(ptr %valist)
36+
call void @llvm.va_end(ptr %valist)
2837
ret void
2938
}
3039

llvm/test/CodeGen/AArch64/vararg-tallcall.ll

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,22 @@ target datalayout = "e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128"
88

99
%class.X = type { i8 }
1010
%struct.B = type { ptr }
11+
%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
1112

1213
$"??_9B@@$BA@AA" = comdat any
1314

1415
; Function Attrs: noinline optnone
1516
define linkonce_odr void @"??_9B@@$BA@AA"(ptr %this, ...) #1 comdat align 2 {
1617
entry:
17-
%valist = alloca i8
18+
%valist = alloca %struct.__va_list
1819
call void @llvm.va_start.p0(ptr %valist)
1920
%this.addr = alloca ptr, align 8
2021
store ptr %this, ptr %this.addr, align 8
2122
%this1 = load ptr, ptr %this.addr, align 8
2223
call void asm sideeffect "", "~{d0}"()
2324
%vtable = load ptr, ptr %this1, align 8
2425
%0 = load ptr, ptr %vtable, align 8
26+
call void @llvm.va_end.p0(ptr %valist)
2527
musttail call void (ptr, ...) %0(ptr %this1, ...)
2628
ret void
2729
; No predecessors!
@@ -38,7 +40,9 @@ attributes #1 = { noinline optnone "thunk" }
3840
; CHECK-EC: mov v7.16b, v0.16b
3941
; CHECK-EC: ldr x9, [x0]
4042
; CHECK-EC: ldr x11, [x9]
43+
; CHECH-EC: add x4, sp, #96
4144
; CHECK-EC: mov v0.16b, v7.16b
42-
; CHECK-EC: add x4, sp, #80
43-
; CHECK-EC: add sp, sp, #80
45+
; CHECK-EC: add x4, sp, #96
46+
; CHECK-EC: ldr x30, [sp, #48]
47+
; CHECK-EC: add sp, sp, #96
4448
; CHECK-EC: br x11

llvm/test/CodeGen/AArch64/win64_vararg2.ll

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22
; RUN: llc < %s -mtriple=aarch64-pc-win32 | FileCheck %s
3-
; RUN: llc < %s -global-isel -mtriple=aarch64-pc-win32 | FileCheck %s --check-prefix=GISEL
3+
; RUN: llc < %s -global-isel -mtriple=aarch64-pc-win32 -global-isel-abort=0 | FileCheck %s --check-prefix=GISEL
4+
5+
%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
46

57
; Function Attrs: mustprogress noinline nounwind optnone uwtable
68
define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
79
; CHECK-LABEL: va_func:
810
; CHECK: .seh_proc va_func
911
; CHECK-NEXT: // %bb.0:
10-
; CHECK-NEXT: sub sp, sp, #32
11-
; CHECK-NEXT: .seh_stackalloc 32
12-
; CHECK-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
13-
; CHECK-NEXT: .seh_save_reg x19, 16
14-
; CHECK-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
15-
; CHECK-NEXT: .seh_save_reg x30, 24
12+
; CHECK-NEXT: sub sp, sp, #112
13+
; CHECK-NEXT: .seh_stackalloc 112
14+
; CHECK-NEXT: str x19, [sp, #48] // 8-byte Folded Spill
15+
; CHECK-NEXT: .seh_save_reg x19, 48
16+
; CHECK-NEXT: str x30, [sp, #56] // 8-byte Folded Spill
17+
; CHECK-NEXT: .seh_save_reg x30, 56
1618
; CHECK-NEXT: .seh_endprologue
19+
; CHECK-NEXT: add x8, sp, #72
1720
; CHECK-NEXT: mov w19, w0
21+
; CHECK-NEXT: stp x3, x4, [sp, #72]
22+
; CHECK-NEXT: stp x5, x6, [sp, #88]
23+
; CHECK-NEXT: str x7, [sp, #104]
24+
; CHECK-NEXT: str x8, [sp, #16]
1825
; CHECK-NEXT: str w0, [sp, #12]
1926
; CHECK-NEXT: strb w1, [sp, #11]
2027
; CHECK-NEXT: strb w2, [sp, #10]
2128
; CHECK-NEXT: bl other
2229
; CHECK-NEXT: cmp w19, w0
2330
; CHECK-NEXT: cset w0, ls
2431
; CHECK-NEXT: .seh_startepilogue
25-
; CHECK-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
26-
; CHECK-NEXT: .seh_save_reg x30, 24
27-
; CHECK-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
28-
; CHECK-NEXT: .seh_save_reg x19, 16
29-
; CHECK-NEXT: add sp, sp, #32
30-
; CHECK-NEXT: .seh_stackalloc 32
32+
; CHECK-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload
33+
; CHECK-NEXT: .seh_save_reg x30, 56
34+
; CHECK-NEXT: ldr x19, [sp, #48] // 8-byte Folded Reload
35+
; CHECK-NEXT: .seh_save_reg x19, 48
36+
; CHECK-NEXT: add sp, sp, #112
37+
; CHECK-NEXT: .seh_stackalloc 112
3138
; CHECK-NEXT: .seh_endepilogue
3239
; CHECK-NEXT: ret
3340
; CHECK-NEXT: .seh_endfunclet
@@ -36,34 +43,38 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
3643
; GISEL-LABEL: va_func:
3744
; GISEL: .seh_proc va_func
3845
; GISEL-NEXT: // %bb.0:
39-
; GISEL-NEXT: sub sp, sp, #80
40-
; GISEL-NEXT: .seh_stackalloc 80
41-
; GISEL-NEXT: str x19, [sp, #16] // 8-byte Folded Spill
42-
; GISEL-NEXT: .seh_save_reg x19, 16
43-
; GISEL-NEXT: str x30, [sp, #24] // 8-byte Folded Spill
44-
; GISEL-NEXT: .seh_save_reg x30, 24
46+
; GISEL-NEXT: sub sp, sp, #112
47+
; GISEL-NEXT: .seh_stackalloc 112
48+
; GISEL-NEXT: str x19, [sp, #48] // 8-byte Folded Spill
49+
; GISEL-NEXT: .seh_save_reg x19, 48
50+
; GISEL-NEXT: str x30, [sp, #56] // 8-byte Folded Spill
51+
; GISEL-NEXT: .seh_save_reg x30, 56
4552
; GISEL-NEXT: .seh_endprologue
46-
; GISEL-NEXT: stp x3, x4, [sp, #40]
53+
; GISEL-NEXT: add x8, sp, #72
4754
; GISEL-NEXT: mov w19, w0
48-
; GISEL-NEXT: stp x5, x6, [sp, #56]
49-
; GISEL-NEXT: str x7, [sp, #72]
55+
; GISEL-NEXT: stp x3, x4, [sp, #72]
56+
; GISEL-NEXT: stp x5, x6, [sp, #88]
57+
; GISEL-NEXT: str x7, [sp, #104]
58+
; GISEL-NEXT: str x8, [sp, #16]
5059
; GISEL-NEXT: str w0, [sp, #12]
5160
; GISEL-NEXT: strb w1, [sp, #11]
5261
; GISEL-NEXT: strb w2, [sp, #10]
5362
; GISEL-NEXT: bl other
5463
; GISEL-NEXT: cmp w19, w0
5564
; GISEL-NEXT: cset w0, ls
5665
; GISEL-NEXT: .seh_startepilogue
57-
; GISEL-NEXT: ldr x30, [sp, #24] // 8-byte Folded Reload
58-
; GISEL-NEXT: .seh_save_reg x30, 24
59-
; GISEL-NEXT: ldr x19, [sp, #16] // 8-byte Folded Reload
60-
; GISEL-NEXT: .seh_save_reg x19, 16
61-
; GISEL-NEXT: add sp, sp, #80
62-
; GISEL-NEXT: .seh_stackalloc 80
66+
; GISEL-NEXT: ldr x30, [sp, #56] // 8-byte Folded Reload
67+
; GISEL-NEXT: .seh_save_reg x30, 56
68+
; GISEL-NEXT: ldr x19, [sp, #48] // 8-byte Folded Reload
69+
; GISEL-NEXT: .seh_save_reg x19, 48
70+
; GISEL-NEXT: add sp, sp, #112
71+
; GISEL-NEXT: .seh_stackalloc 112
6372
; GISEL-NEXT: .seh_endepilogue
6473
; GISEL-NEXT: ret
6574
; GISEL-NEXT: .seh_endfunclet
6675
; GISEL-NEXT: .seh_endproc
76+
%valist = alloca %struct.__va_list
77+
call void @llvm.va_start(ptr %valist)
6778
%a_alloc = alloca i32, align 4
6879
%b_alloc = alloca i8, align 1
6980
%c_alloc = alloca i8, align 1
@@ -73,6 +84,7 @@ define i1 @va_func(i32 %a, i8 %b, i8 %c, ...) {
7384
%a_load = load i32, ptr %a_alloc, align 4
7485
%ret = call noundef i32 @other()
7586
%cmp = icmp ule i32 %a_load, %ret
87+
call void @llvm.va_end(ptr %valist)
7688
ret i1 %cmp
7789
}
7890

0 commit comments

Comments
 (0)