[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / VE / Scalar / stackframe_align.ll
blob7270bf0b9e84d829aedd587593c265ec51620665
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=ve | FileCheck %s
3 ; RUN: llc < %s -mtriple=ve --frame-pointer=all \
4 ; RUN:     | FileCheck %s --check-prefix=CHECKFP
6 ;;; Check stack frame allocation with static and dynamic stack object with
7 ;;; alignments as a test of getFrameIndexReference().
9 ;; Allocated buffer places from 9 to 15 bytes in 16 bytes local vars area.
11 ; Function Attrs: nounwind
12 define i8* @test_frame7(i8* %0) {
13 ; CHECK-LABEL: test_frame7:
14 ; CHECK:       # %bb.0:
15 ; CHECK-NEXT:    adds.l %s11, -16, %s11
16 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB0_2
17 ; CHECK-NEXT:  # %bb.1:
18 ; CHECK-NEXT:    ld %s61, 24(, %s14)
19 ; CHECK-NEXT:    or %s62, 0, %s0
20 ; CHECK-NEXT:    lea %s63, 315
21 ; CHECK-NEXT:    shm.l %s63, (%s61)
22 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
23 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
24 ; CHECK-NEXT:    monc
25 ; CHECK-NEXT:    or %s0, 0, %s62
26 ; CHECK-NEXT:  .LBB0_2:
27 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
28 ; CHECK-NEXT:    lea %s0, 9(, %s11)
29 ; CHECK-NEXT:    st1b %s1, 9(, %s11)
30 ; CHECK-NEXT:    adds.l %s11, 16, %s11
31 ; CHECK-NEXT:    b.l.t (, %s10)
33 ; CHECKFP-LABEL: test_frame7:
34 ; CHECKFP:       # %bb.0:
35 ; CHECKFP-NEXT:    st %s9, (, %s11)
36 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
37 ; CHECKFP-NEXT:    or %s9, 0, %s11
38 ; CHECKFP-NEXT:    lea %s11, -192(, %s11)
39 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB0_2
40 ; CHECKFP-NEXT:  # %bb.1:
41 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
42 ; CHECKFP-NEXT:    or %s62, 0, %s0
43 ; CHECKFP-NEXT:    lea %s63, 315
44 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
45 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
46 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
47 ; CHECKFP-NEXT:    monc
48 ; CHECKFP-NEXT:    or %s0, 0, %s62
49 ; CHECKFP-NEXT:  .LBB0_2:
50 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
51 ; CHECKFP-NEXT:    lea %s0, -7(, %s9)
52 ; CHECKFP-NEXT:    st1b %s1, -7(, %s9)
53 ; CHECKFP-NEXT:    or %s11, 0, %s9
54 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
55 ; CHECKFP-NEXT:    ld %s9, (, %s11)
56 ; CHECKFP-NEXT:    b.l.t (, %s10)
57   %2 = alloca [7 x i8], align 1
58   %3 = getelementptr inbounds [7 x i8], [7 x i8]* %2, i64 0, i64 0
59   %4 = load i8, i8* %0, align 1
60   store i8 %4, i8* %3, align 1
61   ret i8* %3
64 ;; Allocated buffer is aligned by 8, so it places from 8 to 14 bytes in 16
65 ;; bytes local vars area.
67 ; Function Attrs: nounwind
68 define i8* @test_frame7_align8(i8* %0) {
69 ; CHECK-LABEL: test_frame7_align8:
70 ; CHECK:       # %bb.0:
71 ; CHECK-NEXT:    adds.l %s11, -16, %s11
72 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB1_2
73 ; CHECK-NEXT:  # %bb.1:
74 ; CHECK-NEXT:    ld %s61, 24(, %s14)
75 ; CHECK-NEXT:    or %s62, 0, %s0
76 ; CHECK-NEXT:    lea %s63, 315
77 ; CHECK-NEXT:    shm.l %s63, (%s61)
78 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
79 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
80 ; CHECK-NEXT:    monc
81 ; CHECK-NEXT:    or %s0, 0, %s62
82 ; CHECK-NEXT:  .LBB1_2:
83 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
84 ; CHECK-NEXT:    lea %s0, 8(, %s11)
85 ; CHECK-NEXT:    st1b %s1, 8(, %s11)
86 ; CHECK-NEXT:    adds.l %s11, 16, %s11
87 ; CHECK-NEXT:    b.l.t (, %s10)
89 ; CHECKFP-LABEL: test_frame7_align8:
90 ; CHECKFP:       # %bb.0:
91 ; CHECKFP-NEXT:    st %s9, (, %s11)
92 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
93 ; CHECKFP-NEXT:    or %s9, 0, %s11
94 ; CHECKFP-NEXT:    lea %s11, -192(, %s11)
95 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB1_2
96 ; CHECKFP-NEXT:  # %bb.1:
97 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
98 ; CHECKFP-NEXT:    or %s62, 0, %s0
99 ; CHECKFP-NEXT:    lea %s63, 315
100 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
101 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
102 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
103 ; CHECKFP-NEXT:    monc
104 ; CHECKFP-NEXT:    or %s0, 0, %s62
105 ; CHECKFP-NEXT:  .LBB1_2:
106 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
107 ; CHECKFP-NEXT:    lea %s0, -8(, %s9)
108 ; CHECKFP-NEXT:    st1b %s1, -8(, %s9)
109 ; CHECKFP-NEXT:    or %s11, 0, %s9
110 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
111 ; CHECKFP-NEXT:    ld %s9, (, %s11)
112 ; CHECKFP-NEXT:    b.l.t (, %s10)
113   %2 = alloca [7 x i8], align 8
114   %3 = getelementptr inbounds [7 x i8], [7 x i8]* %2, i64 0, i64 0
115   %4 = load i8, i8* %0, align 1
116   store i8 %4, i8* %3, align 1
117   ret i8* %3
120 ;; Allocated buffer is aligned by 16, so it places from 0 to 15 bytes in 16
121 ;; bytes local vars area.
123 ; Function Attrs: nounwind
124 define i8* @test_frame16_align16(i8* %0) {
125 ; CHECK-LABEL: test_frame16_align16:
126 ; CHECK:       # %bb.0:
127 ; CHECK-NEXT:    adds.l %s11, -16, %s11
128 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB2_2
129 ; CHECK-NEXT:  # %bb.1:
130 ; CHECK-NEXT:    ld %s61, 24(, %s14)
131 ; CHECK-NEXT:    or %s62, 0, %s0
132 ; CHECK-NEXT:    lea %s63, 315
133 ; CHECK-NEXT:    shm.l %s63, (%s61)
134 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
135 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
136 ; CHECK-NEXT:    monc
137 ; CHECK-NEXT:    or %s0, 0, %s62
138 ; CHECK-NEXT:  .LBB2_2:
139 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
140 ; CHECK-NEXT:    lea %s0, (, %s11)
141 ; CHECK-NEXT:    st1b %s1, (, %s11)
142 ; CHECK-NEXT:    adds.l %s11, 16, %s11
143 ; CHECK-NEXT:    b.l.t (, %s10)
145 ; CHECKFP-LABEL: test_frame16_align16:
146 ; CHECKFP:       # %bb.0:
147 ; CHECKFP-NEXT:    st %s9, (, %s11)
148 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
149 ; CHECKFP-NEXT:    or %s9, 0, %s11
150 ; CHECKFP-NEXT:    lea %s11, -192(, %s11)
151 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB2_2
152 ; CHECKFP-NEXT:  # %bb.1:
153 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
154 ; CHECKFP-NEXT:    or %s62, 0, %s0
155 ; CHECKFP-NEXT:    lea %s63, 315
156 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
157 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
158 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
159 ; CHECKFP-NEXT:    monc
160 ; CHECKFP-NEXT:    or %s0, 0, %s62
161 ; CHECKFP-NEXT:  .LBB2_2:
162 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
163 ; CHECKFP-NEXT:    lea %s0, -16(, %s9)
164 ; CHECKFP-NEXT:    st1b %s1, -16(, %s9)
165 ; CHECKFP-NEXT:    or %s11, 0, %s9
166 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
167 ; CHECKFP-NEXT:    ld %s9, (, %s11)
168 ; CHECKFP-NEXT:    b.l.t (, %s10)
169   %2 = alloca [16 x i8], align 16
170   %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
171   %4 = load i8, i8* %0, align 1
172   store i8 %4, i8* %3, align 1
173   ret i8* %3
176 ;; Allocated buffer is aligned by 32, so it places from 0 to 15 bytes in 48
177 ;; bytes local vars area.  Or it places from 192 (aligned to 32 bytes) to
178 ;; 207 bytes in 224 + alpha allocated local vars area.
180 ; Function Attrs: nounwind
181 define i8* @test_frame16_align32(i8* %0) {
182 ; CHECK-LABEL: test_frame16_align32:
183 ; CHECK:       # %bb.0:
184 ; CHECK-NEXT:    st %s9, (, %s11)
185 ; CHECK-NEXT:    st %s10, 8(, %s11)
186 ; CHECK-NEXT:    or %s9, 0, %s11
187 ; CHECK-NEXT:    lea %s11, -224(, %s11)
188 ; CHECK-NEXT:    and %s11, %s11, (59)1
189 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB3_2
190 ; CHECK-NEXT:  # %bb.1:
191 ; CHECK-NEXT:    ld %s61, 24(, %s14)
192 ; CHECK-NEXT:    or %s62, 0, %s0
193 ; CHECK-NEXT:    lea %s63, 315
194 ; CHECK-NEXT:    shm.l %s63, (%s61)
195 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
196 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
197 ; CHECK-NEXT:    monc
198 ; CHECK-NEXT:    or %s0, 0, %s62
199 ; CHECK-NEXT:  .LBB3_2:
200 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
201 ; CHECK-NEXT:    lea %s0, 192(, %s11)
202 ; CHECK-NEXT:    st1b %s1, 192(, %s11)
203 ; CHECK-NEXT:    or %s11, 0, %s9
204 ; CHECK-NEXT:    ld %s10, 8(, %s11)
205 ; CHECK-NEXT:    ld %s9, (, %s11)
206 ; CHECK-NEXT:    b.l.t (, %s10)
208 ; CHECKFP-LABEL: test_frame16_align32:
209 ; CHECKFP:       # %bb.0:
210 ; CHECKFP-NEXT:    st %s9, (, %s11)
211 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
212 ; CHECKFP-NEXT:    or %s9, 0, %s11
213 ; CHECKFP-NEXT:    lea %s11, -224(, %s11)
214 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
215 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB3_2
216 ; CHECKFP-NEXT:  # %bb.1:
217 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
218 ; CHECKFP-NEXT:    or %s62, 0, %s0
219 ; CHECKFP-NEXT:    lea %s63, 315
220 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
221 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
222 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
223 ; CHECKFP-NEXT:    monc
224 ; CHECKFP-NEXT:    or %s0, 0, %s62
225 ; CHECKFP-NEXT:  .LBB3_2:
226 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
227 ; CHECKFP-NEXT:    lea %s0, 192(, %s11)
228 ; CHECKFP-NEXT:    st1b %s1, 192(, %s11)
229 ; CHECKFP-NEXT:    or %s11, 0, %s9
230 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
231 ; CHECKFP-NEXT:    ld %s9, (, %s11)
232 ; CHECKFP-NEXT:    b.l.t (, %s10)
233   %2 = alloca [16 x i8], align 32
234   %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
235   %4 = load i8, i8* %0, align 1
236   store i8 %4, i8* %3, align 1
237   ret i8* %3
240 ;; Allocated buffer is aligned by 32, so it places from 0 to 31 bytes in 48
241 ;; + alpha bytes local vars area, or it places from 192 (32 bytes aligned 176)
242 ;; to 223 in 224 + alpha bytes local vars area..
244 ; Function Attrs: nounwind
245 define i8* @test_frame32_align32(i8* %0) {
246 ; CHECK-LABEL: test_frame32_align32:
247 ; CHECK:       # %bb.0:
248 ; CHECK-NEXT:    st %s9, (, %s11)
249 ; CHECK-NEXT:    st %s10, 8(, %s11)
250 ; CHECK-NEXT:    or %s9, 0, %s11
251 ; CHECK-NEXT:    lea %s11, -224(, %s11)
252 ; CHECK-NEXT:    and %s11, %s11, (59)1
253 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB4_2
254 ; CHECK-NEXT:  # %bb.1:
255 ; CHECK-NEXT:    ld %s61, 24(, %s14)
256 ; CHECK-NEXT:    or %s62, 0, %s0
257 ; CHECK-NEXT:    lea %s63, 315
258 ; CHECK-NEXT:    shm.l %s63, (%s61)
259 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
260 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
261 ; CHECK-NEXT:    monc
262 ; CHECK-NEXT:    or %s0, 0, %s62
263 ; CHECK-NEXT:  .LBB4_2:
264 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
265 ; CHECK-NEXT:    lea %s0, 192(, %s11)
266 ; CHECK-NEXT:    st1b %s1, 192(, %s11)
267 ; CHECK-NEXT:    or %s11, 0, %s9
268 ; CHECK-NEXT:    ld %s10, 8(, %s11)
269 ; CHECK-NEXT:    ld %s9, (, %s11)
270 ; CHECK-NEXT:    b.l.t (, %s10)
272 ; CHECKFP-LABEL: test_frame32_align32:
273 ; CHECKFP:       # %bb.0:
274 ; CHECKFP-NEXT:    st %s9, (, %s11)
275 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
276 ; CHECKFP-NEXT:    or %s9, 0, %s11
277 ; CHECKFP-NEXT:    lea %s11, -224(, %s11)
278 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
279 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB4_2
280 ; CHECKFP-NEXT:  # %bb.1:
281 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
282 ; CHECKFP-NEXT:    or %s62, 0, %s0
283 ; CHECKFP-NEXT:    lea %s63, 315
284 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
285 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
286 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
287 ; CHECKFP-NEXT:    monc
288 ; CHECKFP-NEXT:    or %s0, 0, %s62
289 ; CHECKFP-NEXT:  .LBB4_2:
290 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
291 ; CHECKFP-NEXT:    lea %s0, 192(, %s11)
292 ; CHECKFP-NEXT:    st1b %s1, 192(, %s11)
293 ; CHECKFP-NEXT:    or %s11, 0, %s9
294 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
295 ; CHECKFP-NEXT:    ld %s9, (, %s11)
296 ; CHECKFP-NEXT:    b.l.t (, %s10)
297   %2 = alloca [32 x i8], align 32
298   %3 = getelementptr inbounds [32 x i8], [32 x i8]* %2, i64 0, i64 0
299   %4 = load i8, i8* %0, align 1
300   store i8 %4, i8* %3, align 1
301   ret i8* %3
304 ;; Dynamically allocated buffer is aligned by 16, so it places from 0 to 31
305 ;; bytes in allocated area, or it places from 240 (32 bytes aligned 176+64)
306 ;; to 271 in allocated area (actually it places not newly allocated area
307 ;; but in somewhere between newly allocated area and allocated area at the
308 ;; prologue since VE ABI requires the reserved area at the top of stack).
310 ;; FIXME: (size+15)/16*16 is not enough.
312 ; Function Attrs: nounwind
313 define i8* @test_frame_dynalign16(i8* %0, i64 %1) {
314 ; CHECK-LABEL: test_frame_dynalign16:
315 ; CHECK:       # %bb.0:
316 ; CHECK-NEXT:    st %s9, (, %s11)
317 ; CHECK-NEXT:    st %s10, 8(, %s11)
318 ; CHECK-NEXT:    or %s9, 0, %s11
319 ; CHECK-NEXT:    lea %s11, -240(, %s11)
320 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB5_2
321 ; CHECK-NEXT:  # %bb.1:
322 ; CHECK-NEXT:    ld %s61, 24(, %s14)
323 ; CHECK-NEXT:    or %s62, 0, %s0
324 ; CHECK-NEXT:    lea %s63, 315
325 ; CHECK-NEXT:    shm.l %s63, (%s61)
326 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
327 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
328 ; CHECK-NEXT:    monc
329 ; CHECK-NEXT:    or %s0, 0, %s62
330 ; CHECK-NEXT:  .LBB5_2:
331 ; CHECK-NEXT:    or %s2, 0, %s0
332 ; CHECK-NEXT:    lea %s0, 15(, %s1)
333 ; CHECK-NEXT:    and %s0, -16, %s0
334 ; CHECK-NEXT:    lea %s1, __ve_grow_stack@lo
335 ; CHECK-NEXT:    and %s1, %s1, (32)0
336 ; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack@hi(, %s1)
337 ; CHECK-NEXT:    bsic %s10, (, %s12)
338 ; CHECK-NEXT:    lea %s0, 240(, %s11)
339 ; CHECK-NEXT:    ld1b.zx %s1, (, %s2)
340 ; CHECK-NEXT:    st1b %s1, (, %s0)
341 ; CHECK-NEXT:    or %s11, 0, %s9
342 ; CHECK-NEXT:    ld %s10, 8(, %s11)
343 ; CHECK-NEXT:    ld %s9, (, %s11)
344 ; CHECK-NEXT:    b.l.t (, %s10)
346 ; CHECKFP-LABEL: test_frame_dynalign16:
347 ; CHECKFP:       # %bb.0:
348 ; CHECKFP-NEXT:    st %s9, (, %s11)
349 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
350 ; CHECKFP-NEXT:    or %s9, 0, %s11
351 ; CHECKFP-NEXT:    lea %s11, -240(, %s11)
352 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB5_2
353 ; CHECKFP-NEXT:  # %bb.1:
354 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
355 ; CHECKFP-NEXT:    or %s62, 0, %s0
356 ; CHECKFP-NEXT:    lea %s63, 315
357 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
358 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
359 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
360 ; CHECKFP-NEXT:    monc
361 ; CHECKFP-NEXT:    or %s0, 0, %s62
362 ; CHECKFP-NEXT:  .LBB5_2:
363 ; CHECKFP-NEXT:    or %s2, 0, %s0
364 ; CHECKFP-NEXT:    lea %s0, 15(, %s1)
365 ; CHECKFP-NEXT:    and %s0, -16, %s0
366 ; CHECKFP-NEXT:    lea %s1, __ve_grow_stack@lo
367 ; CHECKFP-NEXT:    and %s1, %s1, (32)0
368 ; CHECKFP-NEXT:    lea.sl %s12, __ve_grow_stack@hi(, %s1)
369 ; CHECKFP-NEXT:    bsic %s10, (, %s12)
370 ; CHECKFP-NEXT:    lea %s0, 240(, %s11)
371 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s2)
372 ; CHECKFP-NEXT:    st1b %s1, (, %s0)
373 ; CHECKFP-NEXT:    or %s11, 0, %s9
374 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
375 ; CHECKFP-NEXT:    ld %s9, (, %s11)
376 ; CHECKFP-NEXT:    b.l.t (, %s10)
377   %3 = alloca i8, i64 %1, align 16
378   %4 = load i8, i8* %0, align 1
379   store i8 %4, i8* %3, align 1
380   ret i8* %3
383 ;; This test allocates static buffer with 16 bytes align and dynamic buffer
384 ;; with 32 bytes align.  In LLVM, stack frame is always aligned to 32 bytes
385 ;; (bigger one).  So, LLVM allocates 176 (RSA) + 64 (call site) + 32 (32 bytes
386 ;; aligned 16 bytes data) + 16 (pad to align) if FP is not eliminated.
387 ;; Statically allocated buffer is aligned to 16, so it places from 16 to 31
388 ;; bytes from BP in 32 + alpha bytes local vars area, or it places from 272
389 ;; to 287 bytes from BP in 288 + alpha bytes local vars area.
390 ;; Dynamically allocated buffer is aligned to 32, so it places from aligned
391 ;; address between 240 and 271 from SP.
393 ; Function Attrs: nounwind
394 define i8* @test_frame16_align16_dynalign32(i8* %0, i64 %n) {
395 ; CHECK-LABEL: test_frame16_align16_dynalign32:
396 ; CHECK:       # %bb.0:
397 ; CHECK-NEXT:    st %s9, (, %s11)
398 ; CHECK-NEXT:    st %s10, 8(, %s11)
399 ; CHECK-NEXT:    st %s17, 40(, %s11)
400 ; CHECK-NEXT:    or %s9, 0, %s11
401 ; CHECK-NEXT:    lea %s11, -288(, %s11)
402 ; CHECK-NEXT:    and %s11, %s11, (59)1
403 ; CHECK-NEXT:    or %s17, 0, %s11
404 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB6_2
405 ; CHECK-NEXT:  # %bb.1:
406 ; CHECK-NEXT:    ld %s61, 24(, %s14)
407 ; CHECK-NEXT:    or %s62, 0, %s0
408 ; CHECK-NEXT:    lea %s63, 315
409 ; CHECK-NEXT:    shm.l %s63, (%s61)
410 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
411 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
412 ; CHECK-NEXT:    monc
413 ; CHECK-NEXT:    or %s0, 0, %s62
414 ; CHECK-NEXT:  .LBB6_2:
415 ; CHECK-NEXT:    ld1b.zx %s0, (, %s0)
416 ; CHECK-NEXT:    st1b %s0, 272(, %s17)
417 ; CHECK-NEXT:    lea %s0, 15(, %s1)
418 ; CHECK-NEXT:    and %s0, -16, %s0
419 ; CHECK-NEXT:    lea %s1, __ve_grow_stack_align@lo
420 ; CHECK-NEXT:    and %s1, %s1, (32)0
421 ; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
422 ; CHECK-NEXT:    or %s1, -32, (0)1
423 ; CHECK-NEXT:    bsic %s10, (, %s12)
424 ; CHECK-NEXT:    lea %s0, 240(, %s11)
425 ; CHECK-NEXT:    ld1b.zx %s1, 272(, %s17)
426 ; CHECK-NEXT:    lea %s0, 31(, %s0)
427 ; CHECK-NEXT:    and %s0, -32, %s0
428 ; CHECK-NEXT:    st1b %s1, (, %s0)
429 ; CHECK-NEXT:    or %s11, 0, %s9
430 ; CHECK-NEXT:    ld %s17, 40(, %s11)
431 ; CHECK-NEXT:    ld %s10, 8(, %s11)
432 ; CHECK-NEXT:    ld %s9, (, %s11)
433 ; CHECK-NEXT:    b.l.t (, %s10)
435 ; CHECKFP-LABEL: test_frame16_align16_dynalign32:
436 ; CHECKFP:       # %bb.0:
437 ; CHECKFP-NEXT:    st %s9, (, %s11)
438 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
439 ; CHECKFP-NEXT:    st %s17, 40(, %s11)
440 ; CHECKFP-NEXT:    or %s9, 0, %s11
441 ; CHECKFP-NEXT:    lea %s11, -288(, %s11)
442 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
443 ; CHECKFP-NEXT:    or %s17, 0, %s11
444 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB6_2
445 ; CHECKFP-NEXT:  # %bb.1:
446 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
447 ; CHECKFP-NEXT:    or %s62, 0, %s0
448 ; CHECKFP-NEXT:    lea %s63, 315
449 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
450 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
451 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
452 ; CHECKFP-NEXT:    monc
453 ; CHECKFP-NEXT:    or %s0, 0, %s62
454 ; CHECKFP-NEXT:  .LBB6_2:
455 ; CHECKFP-NEXT:    ld1b.zx %s0, (, %s0)
456 ; CHECKFP-NEXT:    st1b %s0, 272(, %s17)
457 ; CHECKFP-NEXT:    lea %s0, 15(, %s1)
458 ; CHECKFP-NEXT:    and %s0, -16, %s0
459 ; CHECKFP-NEXT:    lea %s1, __ve_grow_stack_align@lo
460 ; CHECKFP-NEXT:    and %s1, %s1, (32)0
461 ; CHECKFP-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
462 ; CHECKFP-NEXT:    or %s1, -32, (0)1
463 ; CHECKFP-NEXT:    bsic %s10, (, %s12)
464 ; CHECKFP-NEXT:    lea %s0, 240(, %s11)
465 ; CHECKFP-NEXT:    ld1b.zx %s1, 272(, %s17)
466 ; CHECKFP-NEXT:    lea %s0, 31(, %s0)
467 ; CHECKFP-NEXT:    and %s0, -32, %s0
468 ; CHECKFP-NEXT:    st1b %s1, (, %s0)
469 ; CHECKFP-NEXT:    or %s11, 0, %s9
470 ; CHECKFP-NEXT:    ld %s17, 40(, %s11)
471 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
472 ; CHECKFP-NEXT:    ld %s9, (, %s11)
473 ; CHECKFP-NEXT:    b.l.t (, %s10)
474   %2 = alloca [16 x i8], align 16
475   %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0
476   %4 = load i8, i8* %0, align 1
477   store i8 %4, i8* %3, align 1
478   %5 = alloca i8, i64 %n, align 32
479   %6 = load i8, i8* %3, align 1
480   store i8 %6, i8* %5, align 1
481   ret i8* %5