Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / VE / Scalar / stackframe_align.ll
blobd90c0bcf9f8372a5cbeb7bff3c8cafc14dc3b952
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 ptr @test_frame7(ptr %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 = load i8, ptr %0, align 1
59   store i8 %3, ptr %2, align 1
60   ret ptr %2
63 ;; Allocated buffer is aligned by 8, so it places from 8 to 14 bytes in 16
64 ;; bytes local vars area.
66 ; Function Attrs: nounwind
67 define ptr @test_frame7_align8(ptr %0) {
68 ; CHECK-LABEL: test_frame7_align8:
69 ; CHECK:       # %bb.0:
70 ; CHECK-NEXT:    adds.l %s11, -16, %s11
71 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB1_2
72 ; CHECK-NEXT:  # %bb.1:
73 ; CHECK-NEXT:    ld %s61, 24(, %s14)
74 ; CHECK-NEXT:    or %s62, 0, %s0
75 ; CHECK-NEXT:    lea %s63, 315
76 ; CHECK-NEXT:    shm.l %s63, (%s61)
77 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
78 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
79 ; CHECK-NEXT:    monc
80 ; CHECK-NEXT:    or %s0, 0, %s62
81 ; CHECK-NEXT:  .LBB1_2:
82 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
83 ; CHECK-NEXT:    lea %s0, 8(, %s11)
84 ; CHECK-NEXT:    st1b %s1, 8(, %s11)
85 ; CHECK-NEXT:    adds.l %s11, 16, %s11
86 ; CHECK-NEXT:    b.l.t (, %s10)
88 ; CHECKFP-LABEL: test_frame7_align8:
89 ; CHECKFP:       # %bb.0:
90 ; CHECKFP-NEXT:    st %s9, (, %s11)
91 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
92 ; CHECKFP-NEXT:    or %s9, 0, %s11
93 ; CHECKFP-NEXT:    lea %s11, -192(, %s11)
94 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB1_2
95 ; CHECKFP-NEXT:  # %bb.1:
96 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
97 ; CHECKFP-NEXT:    or %s62, 0, %s0
98 ; CHECKFP-NEXT:    lea %s63, 315
99 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
100 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
101 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
102 ; CHECKFP-NEXT:    monc
103 ; CHECKFP-NEXT:    or %s0, 0, %s62
104 ; CHECKFP-NEXT:  .LBB1_2:
105 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
106 ; CHECKFP-NEXT:    lea %s0, -8(, %s9)
107 ; CHECKFP-NEXT:    st1b %s1, -8(, %s9)
108 ; CHECKFP-NEXT:    or %s11, 0, %s9
109 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
110 ; CHECKFP-NEXT:    ld %s9, (, %s11)
111 ; CHECKFP-NEXT:    b.l.t (, %s10)
112   %2 = alloca [7 x i8], align 8
113   %3 = load i8, ptr %0, align 1
114   store i8 %3, ptr %2, align 1
115   ret ptr %2
118 ;; Allocated buffer is aligned by 16, so it places from 0 to 15 bytes in 16
119 ;; bytes local vars area.
121 ; Function Attrs: nounwind
122 define ptr @test_frame16_align16(ptr %0) {
123 ; CHECK-LABEL: test_frame16_align16:
124 ; CHECK:       # %bb.0:
125 ; CHECK-NEXT:    adds.l %s11, -16, %s11
126 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB2_2
127 ; CHECK-NEXT:  # %bb.1:
128 ; CHECK-NEXT:    ld %s61, 24(, %s14)
129 ; CHECK-NEXT:    or %s62, 0, %s0
130 ; CHECK-NEXT:    lea %s63, 315
131 ; CHECK-NEXT:    shm.l %s63, (%s61)
132 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
133 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
134 ; CHECK-NEXT:    monc
135 ; CHECK-NEXT:    or %s0, 0, %s62
136 ; CHECK-NEXT:  .LBB2_2:
137 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
138 ; CHECK-NEXT:    lea %s0, (, %s11)
139 ; CHECK-NEXT:    st1b %s1, (, %s11)
140 ; CHECK-NEXT:    adds.l %s11, 16, %s11
141 ; CHECK-NEXT:    b.l.t (, %s10)
143 ; CHECKFP-LABEL: test_frame16_align16:
144 ; CHECKFP:       # %bb.0:
145 ; CHECKFP-NEXT:    st %s9, (, %s11)
146 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
147 ; CHECKFP-NEXT:    or %s9, 0, %s11
148 ; CHECKFP-NEXT:    lea %s11, -192(, %s11)
149 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB2_2
150 ; CHECKFP-NEXT:  # %bb.1:
151 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
152 ; CHECKFP-NEXT:    or %s62, 0, %s0
153 ; CHECKFP-NEXT:    lea %s63, 315
154 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
155 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
156 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
157 ; CHECKFP-NEXT:    monc
158 ; CHECKFP-NEXT:    or %s0, 0, %s62
159 ; CHECKFP-NEXT:  .LBB2_2:
160 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
161 ; CHECKFP-NEXT:    lea %s0, -16(, %s9)
162 ; CHECKFP-NEXT:    st1b %s1, -16(, %s9)
163 ; CHECKFP-NEXT:    or %s11, 0, %s9
164 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
165 ; CHECKFP-NEXT:    ld %s9, (, %s11)
166 ; CHECKFP-NEXT:    b.l.t (, %s10)
167   %2 = alloca [16 x i8], align 16
168   %3 = load i8, ptr %0, align 1
169   store i8 %3, ptr %2, align 1
170   ret ptr %2
173 ;; Allocated buffer is aligned by 32, so it places from 0 to 15 bytes in 48
174 ;; bytes local vars area.  Or it places from 192 (aligned to 32 bytes) to
175 ;; 207 bytes in 224 + alpha allocated local vars area.
177 ; Function Attrs: nounwind
178 define ptr @test_frame16_align32(ptr %0) {
179 ; CHECK-LABEL: test_frame16_align32:
180 ; CHECK:       # %bb.0:
181 ; CHECK-NEXT:    st %s9, (, %s11)
182 ; CHECK-NEXT:    st %s10, 8(, %s11)
183 ; CHECK-NEXT:    or %s9, 0, %s11
184 ; CHECK-NEXT:    lea %s11, -224(, %s11)
185 ; CHECK-NEXT:    and %s11, %s11, (59)1
186 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB3_2
187 ; CHECK-NEXT:  # %bb.1:
188 ; CHECK-NEXT:    ld %s61, 24(, %s14)
189 ; CHECK-NEXT:    or %s62, 0, %s0
190 ; CHECK-NEXT:    lea %s63, 315
191 ; CHECK-NEXT:    shm.l %s63, (%s61)
192 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
193 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
194 ; CHECK-NEXT:    monc
195 ; CHECK-NEXT:    or %s0, 0, %s62
196 ; CHECK-NEXT:  .LBB3_2:
197 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
198 ; CHECK-NEXT:    lea %s0, 192(, %s11)
199 ; CHECK-NEXT:    st1b %s1, 192(, %s11)
200 ; CHECK-NEXT:    or %s11, 0, %s9
201 ; CHECK-NEXT:    ld %s10, 8(, %s11)
202 ; CHECK-NEXT:    ld %s9, (, %s11)
203 ; CHECK-NEXT:    b.l.t (, %s10)
205 ; CHECKFP-LABEL: test_frame16_align32:
206 ; CHECKFP:       # %bb.0:
207 ; CHECKFP-NEXT:    st %s9, (, %s11)
208 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
209 ; CHECKFP-NEXT:    or %s9, 0, %s11
210 ; CHECKFP-NEXT:    lea %s11, -224(, %s11)
211 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
212 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB3_2
213 ; CHECKFP-NEXT:  # %bb.1:
214 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
215 ; CHECKFP-NEXT:    or %s62, 0, %s0
216 ; CHECKFP-NEXT:    lea %s63, 315
217 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
218 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
219 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
220 ; CHECKFP-NEXT:    monc
221 ; CHECKFP-NEXT:    or %s0, 0, %s62
222 ; CHECKFP-NEXT:  .LBB3_2:
223 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
224 ; CHECKFP-NEXT:    lea %s0, 192(, %s11)
225 ; CHECKFP-NEXT:    st1b %s1, 192(, %s11)
226 ; CHECKFP-NEXT:    or %s11, 0, %s9
227 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
228 ; CHECKFP-NEXT:    ld %s9, (, %s11)
229 ; CHECKFP-NEXT:    b.l.t (, %s10)
230   %2 = alloca [16 x i8], align 32
231   %3 = load i8, ptr %0, align 1
232   store i8 %3, ptr %2, align 1
233   ret ptr %2
236 ;; Allocated buffer is aligned by 32, so it places from 0 to 31 bytes in 48
237 ;; + alpha bytes local vars area, or it places from 192 (32 bytes aligned 176)
238 ;; to 223 in 224 + alpha bytes local vars area..
240 ; Function Attrs: nounwind
241 define ptr @test_frame32_align32(ptr %0) {
242 ; CHECK-LABEL: test_frame32_align32:
243 ; CHECK:       # %bb.0:
244 ; CHECK-NEXT:    st %s9, (, %s11)
245 ; CHECK-NEXT:    st %s10, 8(, %s11)
246 ; CHECK-NEXT:    or %s9, 0, %s11
247 ; CHECK-NEXT:    lea %s11, -224(, %s11)
248 ; CHECK-NEXT:    and %s11, %s11, (59)1
249 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB4_2
250 ; CHECK-NEXT:  # %bb.1:
251 ; CHECK-NEXT:    ld %s61, 24(, %s14)
252 ; CHECK-NEXT:    or %s62, 0, %s0
253 ; CHECK-NEXT:    lea %s63, 315
254 ; CHECK-NEXT:    shm.l %s63, (%s61)
255 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
256 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
257 ; CHECK-NEXT:    monc
258 ; CHECK-NEXT:    or %s0, 0, %s62
259 ; CHECK-NEXT:  .LBB4_2:
260 ; CHECK-NEXT:    ld1b.zx %s1, (, %s0)
261 ; CHECK-NEXT:    lea %s0, 192(, %s11)
262 ; CHECK-NEXT:    st1b %s1, 192(, %s11)
263 ; CHECK-NEXT:    or %s11, 0, %s9
264 ; CHECK-NEXT:    ld %s10, 8(, %s11)
265 ; CHECK-NEXT:    ld %s9, (, %s11)
266 ; CHECK-NEXT:    b.l.t (, %s10)
268 ; CHECKFP-LABEL: test_frame32_align32:
269 ; CHECKFP:       # %bb.0:
270 ; CHECKFP-NEXT:    st %s9, (, %s11)
271 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
272 ; CHECKFP-NEXT:    or %s9, 0, %s11
273 ; CHECKFP-NEXT:    lea %s11, -224(, %s11)
274 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
275 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB4_2
276 ; CHECKFP-NEXT:  # %bb.1:
277 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
278 ; CHECKFP-NEXT:    or %s62, 0, %s0
279 ; CHECKFP-NEXT:    lea %s63, 315
280 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
281 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
282 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
283 ; CHECKFP-NEXT:    monc
284 ; CHECKFP-NEXT:    or %s0, 0, %s62
285 ; CHECKFP-NEXT:  .LBB4_2:
286 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s0)
287 ; CHECKFP-NEXT:    lea %s0, 192(, %s11)
288 ; CHECKFP-NEXT:    st1b %s1, 192(, %s11)
289 ; CHECKFP-NEXT:    or %s11, 0, %s9
290 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
291 ; CHECKFP-NEXT:    ld %s9, (, %s11)
292 ; CHECKFP-NEXT:    b.l.t (, %s10)
293   %2 = alloca [32 x i8], align 32
294   %3 = load i8, ptr %0, align 1
295   store i8 %3, ptr %2, align 1
296   ret ptr %2
299 ;; Dynamically allocated buffer is aligned by 16, so it places from 0 to 31
300 ;; bytes in allocated area, or it places from 240 (32 bytes aligned 176+64)
301 ;; to 271 in allocated area (actually it places not newly allocated area
302 ;; but in somewhere between newly allocated area and allocated area at the
303 ;; prologue since VE ABI requires the reserved area at the top of stack).
305 ;; FIXME: (size+15)/16*16 is not enough.
307 ; Function Attrs: nounwind
308 define ptr @test_frame_dynalign16(ptr %0, i64 %1) {
309 ; CHECK-LABEL: test_frame_dynalign16:
310 ; CHECK:       # %bb.0:
311 ; CHECK-NEXT:    st %s9, (, %s11)
312 ; CHECK-NEXT:    st %s10, 8(, %s11)
313 ; CHECK-NEXT:    or %s9, 0, %s11
314 ; CHECK-NEXT:    lea %s11, -240(, %s11)
315 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB5_2
316 ; CHECK-NEXT:  # %bb.1:
317 ; CHECK-NEXT:    ld %s61, 24(, %s14)
318 ; CHECK-NEXT:    or %s62, 0, %s0
319 ; CHECK-NEXT:    lea %s63, 315
320 ; CHECK-NEXT:    shm.l %s63, (%s61)
321 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
322 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
323 ; CHECK-NEXT:    monc
324 ; CHECK-NEXT:    or %s0, 0, %s62
325 ; CHECK-NEXT:  .LBB5_2:
326 ; CHECK-NEXT:    or %s2, 0, %s0
327 ; CHECK-NEXT:    lea %s0, 15(, %s1)
328 ; CHECK-NEXT:    and %s0, -16, %s0
329 ; CHECK-NEXT:    lea %s1, __ve_grow_stack@lo
330 ; CHECK-NEXT:    and %s1, %s1, (32)0
331 ; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack@hi(, %s1)
332 ; CHECK-NEXT:    bsic %s10, (, %s12)
333 ; CHECK-NEXT:    lea %s0, 240(, %s11)
334 ; CHECK-NEXT:    ld1b.zx %s1, (, %s2)
335 ; CHECK-NEXT:    st1b %s1, (, %s0)
336 ; CHECK-NEXT:    or %s11, 0, %s9
337 ; CHECK-NEXT:    ld %s10, 8(, %s11)
338 ; CHECK-NEXT:    ld %s9, (, %s11)
339 ; CHECK-NEXT:    b.l.t (, %s10)
341 ; CHECKFP-LABEL: test_frame_dynalign16:
342 ; CHECKFP:       # %bb.0:
343 ; CHECKFP-NEXT:    st %s9, (, %s11)
344 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
345 ; CHECKFP-NEXT:    or %s9, 0, %s11
346 ; CHECKFP-NEXT:    lea %s11, -240(, %s11)
347 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB5_2
348 ; CHECKFP-NEXT:  # %bb.1:
349 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
350 ; CHECKFP-NEXT:    or %s62, 0, %s0
351 ; CHECKFP-NEXT:    lea %s63, 315
352 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
353 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
354 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
355 ; CHECKFP-NEXT:    monc
356 ; CHECKFP-NEXT:    or %s0, 0, %s62
357 ; CHECKFP-NEXT:  .LBB5_2:
358 ; CHECKFP-NEXT:    or %s2, 0, %s0
359 ; CHECKFP-NEXT:    lea %s0, 15(, %s1)
360 ; CHECKFP-NEXT:    and %s0, -16, %s0
361 ; CHECKFP-NEXT:    lea %s1, __ve_grow_stack@lo
362 ; CHECKFP-NEXT:    and %s1, %s1, (32)0
363 ; CHECKFP-NEXT:    lea.sl %s12, __ve_grow_stack@hi(, %s1)
364 ; CHECKFP-NEXT:    bsic %s10, (, %s12)
365 ; CHECKFP-NEXT:    lea %s0, 240(, %s11)
366 ; CHECKFP-NEXT:    ld1b.zx %s1, (, %s2)
367 ; CHECKFP-NEXT:    st1b %s1, (, %s0)
368 ; CHECKFP-NEXT:    or %s11, 0, %s9
369 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
370 ; CHECKFP-NEXT:    ld %s9, (, %s11)
371 ; CHECKFP-NEXT:    b.l.t (, %s10)
372   %3 = alloca i8, i64 %1, align 16
373   %4 = load i8, ptr %0, align 1
374   store i8 %4, ptr %3, align 1
375   ret ptr %3
378 ;; This test allocates static buffer with 16 bytes align and dynamic buffer
379 ;; with 32 bytes align.  In LLVM, stack frame is always aligned to 32 bytes
380 ;; (bigger one).  So, LLVM allocates 176 (RSA) + 64 (call site) + 32 (32 bytes
381 ;; aligned 16 bytes data) + 16 (pad to align) if FP is not eliminated.
382 ;; Statically allocated buffer is aligned to 16, so it places from 16 to 31
383 ;; bytes from BP in 32 + alpha bytes local vars area, or it places from 272
384 ;; to 287 bytes from BP in 288 + alpha bytes local vars area.
385 ;; Dynamically allocated buffer is aligned to 32, so it places from aligned
386 ;; address between 240 and 271 from SP.
388 ; Function Attrs: nounwind
389 define ptr @test_frame16_align16_dynalign32(ptr %0, i64 %n) {
390 ; CHECK-LABEL: test_frame16_align16_dynalign32:
391 ; CHECK:       # %bb.0:
392 ; CHECK-NEXT:    st %s9, (, %s11)
393 ; CHECK-NEXT:    st %s10, 8(, %s11)
394 ; CHECK-NEXT:    st %s17, 40(, %s11)
395 ; CHECK-NEXT:    or %s9, 0, %s11
396 ; CHECK-NEXT:    lea %s11, -288(, %s11)
397 ; CHECK-NEXT:    and %s11, %s11, (59)1
398 ; CHECK-NEXT:    or %s17, 0, %s11
399 ; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB6_2
400 ; CHECK-NEXT:  # %bb.1:
401 ; CHECK-NEXT:    ld %s61, 24(, %s14)
402 ; CHECK-NEXT:    or %s62, 0, %s0
403 ; CHECK-NEXT:    lea %s63, 315
404 ; CHECK-NEXT:    shm.l %s63, (%s61)
405 ; CHECK-NEXT:    shm.l %s8, 8(%s61)
406 ; CHECK-NEXT:    shm.l %s11, 16(%s61)
407 ; CHECK-NEXT:    monc
408 ; CHECK-NEXT:    or %s0, 0, %s62
409 ; CHECK-NEXT:  .LBB6_2:
410 ; CHECK-NEXT:    ld1b.zx %s0, (, %s0)
411 ; CHECK-NEXT:    st1b %s0, 272(, %s17)
412 ; CHECK-NEXT:    lea %s0, 15(, %s1)
413 ; CHECK-NEXT:    and %s0, -16, %s0
414 ; CHECK-NEXT:    lea %s1, __ve_grow_stack_align@lo
415 ; CHECK-NEXT:    and %s1, %s1, (32)0
416 ; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
417 ; CHECK-NEXT:    or %s1, -32, (0)1
418 ; CHECK-NEXT:    bsic %s10, (, %s12)
419 ; CHECK-NEXT:    lea %s0, 240(, %s11)
420 ; CHECK-NEXT:    ld1b.zx %s1, 272(, %s17)
421 ; CHECK-NEXT:    lea %s0, 31(, %s0)
422 ; CHECK-NEXT:    and %s0, -32, %s0
423 ; CHECK-NEXT:    st1b %s1, (, %s0)
424 ; CHECK-NEXT:    or %s11, 0, %s9
425 ; CHECK-NEXT:    ld %s17, 40(, %s11)
426 ; CHECK-NEXT:    ld %s10, 8(, %s11)
427 ; CHECK-NEXT:    ld %s9, (, %s11)
428 ; CHECK-NEXT:    b.l.t (, %s10)
430 ; CHECKFP-LABEL: test_frame16_align16_dynalign32:
431 ; CHECKFP:       # %bb.0:
432 ; CHECKFP-NEXT:    st %s9, (, %s11)
433 ; CHECKFP-NEXT:    st %s10, 8(, %s11)
434 ; CHECKFP-NEXT:    st %s17, 40(, %s11)
435 ; CHECKFP-NEXT:    or %s9, 0, %s11
436 ; CHECKFP-NEXT:    lea %s11, -288(, %s11)
437 ; CHECKFP-NEXT:    and %s11, %s11, (59)1
438 ; CHECKFP-NEXT:    or %s17, 0, %s11
439 ; CHECKFP-NEXT:    brge.l.t %s11, %s8, .LBB6_2
440 ; CHECKFP-NEXT:  # %bb.1:
441 ; CHECKFP-NEXT:    ld %s61, 24(, %s14)
442 ; CHECKFP-NEXT:    or %s62, 0, %s0
443 ; CHECKFP-NEXT:    lea %s63, 315
444 ; CHECKFP-NEXT:    shm.l %s63, (%s61)
445 ; CHECKFP-NEXT:    shm.l %s8, 8(%s61)
446 ; CHECKFP-NEXT:    shm.l %s11, 16(%s61)
447 ; CHECKFP-NEXT:    monc
448 ; CHECKFP-NEXT:    or %s0, 0, %s62
449 ; CHECKFP-NEXT:  .LBB6_2:
450 ; CHECKFP-NEXT:    ld1b.zx %s0, (, %s0)
451 ; CHECKFP-NEXT:    st1b %s0, 272(, %s17)
452 ; CHECKFP-NEXT:    lea %s0, 15(, %s1)
453 ; CHECKFP-NEXT:    and %s0, -16, %s0
454 ; CHECKFP-NEXT:    lea %s1, __ve_grow_stack_align@lo
455 ; CHECKFP-NEXT:    and %s1, %s1, (32)0
456 ; CHECKFP-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
457 ; CHECKFP-NEXT:    or %s1, -32, (0)1
458 ; CHECKFP-NEXT:    bsic %s10, (, %s12)
459 ; CHECKFP-NEXT:    lea %s0, 240(, %s11)
460 ; CHECKFP-NEXT:    ld1b.zx %s1, 272(, %s17)
461 ; CHECKFP-NEXT:    lea %s0, 31(, %s0)
462 ; CHECKFP-NEXT:    and %s0, -32, %s0
463 ; CHECKFP-NEXT:    st1b %s1, (, %s0)
464 ; CHECKFP-NEXT:    or %s11, 0, %s9
465 ; CHECKFP-NEXT:    ld %s17, 40(, %s11)
466 ; CHECKFP-NEXT:    ld %s10, 8(, %s11)
467 ; CHECKFP-NEXT:    ld %s9, (, %s11)
468 ; CHECKFP-NEXT:    b.l.t (, %s10)
469   %2 = alloca [16 x i8], align 16
470   %3 = load i8, ptr %0, align 1
471   store i8 %3, ptr %2, align 1
472   %4 = alloca i8, i64 %n, align 32
473   %5 = load i8, ptr %2, align 1
474   store i8 %5, ptr %4, align 1
475   ret ptr %4