xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/stackframe_align.ll (revision b006b60dc993b2e0ba3e412c80709477241b6be6)
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
5
6;;; Check stack frame allocation with static and dynamic stack object with
7;;; alignments as a test of getFrameIndexReference().
8
9;; Allocated buffer places from 9 to 15 bytes in 16 bytes local vars area.
10
11; Function Attrs: nounwind
12define 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)
32;
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
61}
62
63;; Allocated buffer is aligned by 8, so it places from 8 to 14 bytes in 16
64;; bytes local vars area.
65
66; Function Attrs: nounwind
67define 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)
87;
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
116}
117
118;; Allocated buffer is aligned by 16, so it places from 0 to 15 bytes in 16
119;; bytes local vars area.
120
121; Function Attrs: nounwind
122define 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)
142;
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
171}
172
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.
176
177; Function Attrs: nounwind
178define 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)
204;
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
234}
235
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..
239
240; Function Attrs: nounwind
241define 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)
267;
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
297}
298
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).
304
305;; FIXME: (size+15)/16*16 is not enough.
306
307; Function Attrs: nounwind
308define 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)
340;
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
376}
377
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.
387
388; Function Attrs: nounwind
389define 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)
429;
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
476}
477
478