• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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)
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 = 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
62}
63
64;; Allocated buffer is aligned by 8, so it places from 8 to 14 bytes in 16
65;; bytes local vars area.
66
67; Function Attrs: nounwind
68define 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)
88;
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
118}
119
120;; Allocated buffer is aligned by 16, so it places from 0 to 15 bytes in 16
121;; bytes local vars area.
122
123; Function Attrs: nounwind
124define 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)
144;
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
174}
175
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.
179
180; Function Attrs: nounwind
181define 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)
207;
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
238}
239
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..
243
244; Function Attrs: nounwind
245define 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)
271;
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
302}
303
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).
309
310;; FIXME: (size+15)/16*16 is not enough.
311
312; Function Attrs: nounwind
313define 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)
345;
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
381}
382
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.
392
393; Function Attrs: nounwind
394define 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)
434;
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
482}
483
484