1+ ; RUN: llc -march=sbf -mattr=+dynamic-frames-v3,+optimize-stack-space < %s | FileCheck --check-prefix=CHECK %s
2+
3+ ; Function Attrs: nounwind uwtable
4+ define i32 @caller_no_alloca (i32 %a , i32 %b , i32 %c ) #0 {
5+ entry:
6+ ; CHECK-LABEL: caller_no_alloca
7+
8+ ; No changes to the stack pointer
9+ ; CHECK: add64 r10, -4096
10+
11+ ; Saving arguments on the stack
12+ ; CHECK: stdw [r10 + 40], 60
13+ ; CHECK: stdw [r10 + 32], 55
14+ ; CHECK: stdw [r10 + 24], 50
15+ ; CHECK: stdw [r10 + 16], 4
16+ ; CHECK: stdw [r10 + 8], 3
17+
18+ ; CHECK: mov64 r4, 1
19+ ; CHECK: mov64 r5, 2
20+ ; CHECK: call callee_alloca
21+
22+ %call = tail call i32 @callee_alloca (i32 %a , i32 %b , i32 %c , i32 1 , i32 2 , i32 3 , i32 4 , i32 50 , i32 55 , i32 60 ) #3
23+ ret i32 %call
24+ }
25+
26+ ; Function Attrs: nounwind uwtable
27+ define i32 @caller_alloca (i32 %a , i32 %b , i32 %c ) #0 {
28+ ; CHECK-LABEL: caller_alloca
29+ ; CHECK: add64 r10, -896
30+ ; CHECK: ldxw r1, [r10 - 128]
31+ ; 88 is 8*7 + 32
32+
33+
34+ ; Saving arguments in the callee's frame
35+
36+ ; Offset in the callee: frame_size - 40
37+ ; CHECK-V3: stdw [r10 + 40], 60
38+ ; Offset in the callee: frame_size - 32
39+ ; CHECK-V3: stdw [r10 + 32], 55
40+ ; Offset in the callee: frame_size - 24
41+ ; CHECK-V3: stdw [r10 + 24], 50
42+ ; Offset in the callee: frame_size - 16
43+ ; CHECK-V3: stdw [r10 + 16], 4
44+ ; Offset in the callee: frame_size - 8
45+ ; CHECK-V3: stdw [r10 + 8], 3
46+
47+ ; CHECK: mov64 r4, 1
48+ ; CHECK: mov64 r5, 2
49+ ; CHECK: call callee_no_alloca
50+ ; CHECK: ldxw r1, [r10 - 56]
51+
52+ entry:
53+ %g = alloca [3128 x i8 ], align 8
54+ %off = getelementptr i64 , ptr %g , i64 7
55+ %g1 = load i32 , ptr %off
56+ %call = tail call i32 @callee_no_alloca (i32 %g1 , i32 %b , i32 %c , i32 1 , i32 2 , i32 3 , i32 4 , i32 50 , i32 55 , i32 60 ) #3
57+ %h = alloca i128
58+ %h1 = load i32 , ptr %h
59+ %res = sub i32 %call , %h1
60+ ret i32 %res
61+ }
62+
63+ ; Function Attrs: nounwind uwtable
64+ define i32 @callee_alloca (i32 %a , i32 %b , i32 %c , i32 %d , i32 %e , i32 %f , i32 %p , i32 %y , i32 %a1 , i32 %a2 ) #1 {
65+ ; CHECK-LABEL: callee_alloca
66+ ; CHECK: add64 r10, -1024
67+
68+ ; Loading arguments
69+ ; CHECK: ldxw r2, [r10 - 3064]
70+ ; CHECK: ldxw r2, [r10 - 3056]
71+ ; CHECK: ldxw r2, [r10 - 3048]
72+ ; CHECK: ldxw r2, [r10 - 3040]
73+ ; CHECK: ldxw r2, [r10 - 3032]
74+ ; Loading allocated i32
75+ ; CHECK-V3: ldxw r0, [r10 - 32]
76+
77+
78+ ; CHECK-NOT: add64 r10, 128
79+
80+ entry:
81+ %o = alloca [3000 x i8 ], align 8
82+ %g = add i32 %a , %b
83+ %h = sub i32 %g , %c
84+ %i = add i32 %h , %d
85+ %j = sub i32 %i , %e
86+ %k = add i32 %j , %f
87+ %l = add i32 %k , %p
88+ %m = add i32 %l , %y
89+ %n = add i32 %m , %a1
90+ %q = add i32 %n , %a2
91+ %r = load i32 , ptr %o
92+ %s = add i32 %r , %q
93+ ret i32 %s
94+ }
95+
96+ ; Function Attrs: nounwind uwtable
97+ define i32 @callee_no_alloca (i32 %a , i32 %b , i32 %c , i32 %d , i32 %e , i32 %f , i32 %p , i32 %y , i32 %a1 , i32 %a2 ) #1 {
98+ ; CHECK-LABEL: callee_no_alloca
99+ ; CHECK: add64 r10, -4032
100+
101+ ; Loading arguments
102+ ; CHECK: ldxw r1, [r10 - 56]
103+ ; CHECK: ldxw r1, [r10 - 48]
104+ ; CHECK: ldxw r1, [r10 - 40]
105+ ; CHECK: ldxw r1, [r10 - 32]
106+ ; CHECK: ldxw r1, [r10 - 24]
107+
108+ ; CHECK-NOT: add64 r10, 64
109+ entry:
110+ %g = add i32 %a , %b
111+ %h = sub i32 %g , %c
112+ %i = add i32 %h , %d
113+ %j = sub i32 %i , %e
114+ %k = add i32 %j , %f
115+ %l = add i32 %k , %p
116+ %m = add i32 %l , %y
117+ %n = add i32 %m , %a1
118+ %q = add i32 %n , %a2
119+ ret i32 %q
120+ }
0 commit comments