xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/stackframe_call.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 -relocation-model=pic \
4; RUN:     | FileCheck %s --check-prefix=PIC
5
6;;; Check stack frame allocation of a function which calls other functions
7;;; under following conditions and combinations of them:
8;;;   - access variable or not
9;;;   - no stack object, a stack object using BP, or a stack object not using BP
10;;;   - isPositionIndependent or not
11
12@data = external global i8, align 1
13
14; Function Attrs: nounwind
15define ptr @test_frame0(ptr %0, ptr %1) {
16; CHECK-LABEL: test_frame0:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    st %s9, (, %s11)
19; CHECK-NEXT:    st %s10, 8(, %s11)
20; CHECK-NEXT:    or %s9, 0, %s11
21; CHECK-NEXT:    lea %s11, -240(, %s11)
22; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB0_2
23; CHECK-NEXT:  # %bb.1:
24; CHECK-NEXT:    ld %s61, 24(, %s14)
25; CHECK-NEXT:    or %s62, 0, %s0
26; CHECK-NEXT:    lea %s63, 315
27; CHECK-NEXT:    shm.l %s63, (%s61)
28; CHECK-NEXT:    shm.l %s8, 8(%s61)
29; CHECK-NEXT:    shm.l %s11, 16(%s61)
30; CHECK-NEXT:    monc
31; CHECK-NEXT:    or %s0, 0, %s62
32; CHECK-NEXT:  .LBB0_2:
33; CHECK-NEXT:    lea %s2, fun@lo
34; CHECK-NEXT:    and %s2, %s2, (32)0
35; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s2)
36; CHECK-NEXT:    bsic %s10, (, %s12)
37; CHECK-NEXT:    or %s11, 0, %s9
38; CHECK-NEXT:    ld %s10, 8(, %s11)
39; CHECK-NEXT:    ld %s9, (, %s11)
40; CHECK-NEXT:    b.l.t (, %s10)
41;
42; PIC-LABEL: test_frame0:
43; PIC:       # %bb.0:
44; PIC-NEXT:    st %s9, (, %s11)
45; PIC-NEXT:    st %s10, 8(, %s11)
46; PIC-NEXT:    st %s15, 24(, %s11)
47; PIC-NEXT:    st %s16, 32(, %s11)
48; PIC-NEXT:    or %s9, 0, %s11
49; PIC-NEXT:    lea %s11, -240(, %s11)
50; PIC-NEXT:    brge.l.t %s11, %s8, .LBB0_2
51; PIC-NEXT:  # %bb.1:
52; PIC-NEXT:    ld %s61, 24(, %s14)
53; PIC-NEXT:    or %s62, 0, %s0
54; PIC-NEXT:    lea %s63, 315
55; PIC-NEXT:    shm.l %s63, (%s61)
56; PIC-NEXT:    shm.l %s8, 8(%s61)
57; PIC-NEXT:    shm.l %s11, 16(%s61)
58; PIC-NEXT:    monc
59; PIC-NEXT:    or %s0, 0, %s62
60; PIC-NEXT:  .LBB0_2:
61; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
62; PIC-NEXT:    and %s15, %s15, (32)0
63; PIC-NEXT:    sic %s16
64; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
65; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
66; PIC-NEXT:    and %s12, %s12, (32)0
67; PIC-NEXT:    sic %s16
68; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
69; PIC-NEXT:    bsic %s10, (, %s12)
70; PIC-NEXT:    or %s11, 0, %s9
71; PIC-NEXT:    ld %s16, 32(, %s11)
72; PIC-NEXT:    ld %s15, 24(, %s11)
73; PIC-NEXT:    ld %s10, 8(, %s11)
74; PIC-NEXT:    ld %s9, (, %s11)
75; PIC-NEXT:    b.l.t (, %s10)
76  %3 = tail call ptr @fun(ptr %0, ptr %1)
77  ret ptr %3
78}
79
80declare ptr @fun(ptr, ptr)
81
82; Function Attrs: nounwind
83define ptr @test_frame32(ptr %0) {
84; CHECK-LABEL: test_frame32:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    st %s9, (, %s11)
87; CHECK-NEXT:    st %s10, 8(, %s11)
88; CHECK-NEXT:    or %s9, 0, %s11
89; CHECK-NEXT:    lea %s11, -272(, %s11)
90; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB1_2
91; CHECK-NEXT:  # %bb.1:
92; CHECK-NEXT:    ld %s61, 24(, %s14)
93; CHECK-NEXT:    or %s62, 0, %s0
94; CHECK-NEXT:    lea %s63, 315
95; CHECK-NEXT:    shm.l %s63, (%s61)
96; CHECK-NEXT:    shm.l %s8, 8(%s61)
97; CHECK-NEXT:    shm.l %s11, 16(%s61)
98; CHECK-NEXT:    monc
99; CHECK-NEXT:    or %s0, 0, %s62
100; CHECK-NEXT:  .LBB1_2:
101; CHECK-NEXT:    or %s1, 0, %s0
102; CHECK-NEXT:    lea %s0, fun@lo
103; CHECK-NEXT:    and %s0, %s0, (32)0
104; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s0)
105; CHECK-NEXT:    lea %s0, 240(, %s11)
106; CHECK-NEXT:    bsic %s10, (, %s12)
107; CHECK-NEXT:    or %s11, 0, %s9
108; CHECK-NEXT:    ld %s10, 8(, %s11)
109; CHECK-NEXT:    ld %s9, (, %s11)
110; CHECK-NEXT:    b.l.t (, %s10)
111;
112; PIC-LABEL: test_frame32:
113; PIC:       # %bb.0:
114; PIC-NEXT:    st %s9, (, %s11)
115; PIC-NEXT:    st %s10, 8(, %s11)
116; PIC-NEXT:    st %s15, 24(, %s11)
117; PIC-NEXT:    st %s16, 32(, %s11)
118; PIC-NEXT:    or %s9, 0, %s11
119; PIC-NEXT:    lea %s11, -272(, %s11)
120; PIC-NEXT:    brge.l.t %s11, %s8, .LBB1_2
121; PIC-NEXT:  # %bb.1:
122; PIC-NEXT:    ld %s61, 24(, %s14)
123; PIC-NEXT:    or %s62, 0, %s0
124; PIC-NEXT:    lea %s63, 315
125; PIC-NEXT:    shm.l %s63, (%s61)
126; PIC-NEXT:    shm.l %s8, 8(%s61)
127; PIC-NEXT:    shm.l %s11, 16(%s61)
128; PIC-NEXT:    monc
129; PIC-NEXT:    or %s0, 0, %s62
130; PIC-NEXT:  .LBB1_2:
131; PIC-NEXT:    or %s1, 0, %s0
132; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
133; PIC-NEXT:    and %s15, %s15, (32)0
134; PIC-NEXT:    sic %s16
135; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
136; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
137; PIC-NEXT:    and %s12, %s12, (32)0
138; PIC-NEXT:    sic %s16
139; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
140; PIC-NEXT:    lea %s0, 240(, %s11)
141; PIC-NEXT:    bsic %s10, (, %s12)
142; PIC-NEXT:    or %s11, 0, %s9
143; PIC-NEXT:    ld %s16, 32(, %s11)
144; PIC-NEXT:    ld %s15, 24(, %s11)
145; PIC-NEXT:    ld %s10, 8(, %s11)
146; PIC-NEXT:    ld %s9, (, %s11)
147; PIC-NEXT:    b.l.t (, %s10)
148  %2 = alloca [32 x i8], align 1
149  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %2)
150  %3 = call ptr @fun(ptr nonnull %2, ptr %0)
151  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %2)
152  ret ptr %3
153}
154
155; Function Attrs: argmemonly nofree nosync nounwind willreturn
156declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
157
158; Function Attrs: argmemonly nofree nosync nounwind willreturn
159declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
160
161; Function Attrs: nounwind
162define ptr @test_align32(i32 signext %0, ptr nocapture readnone %1) {
163; CHECK-LABEL: test_align32:
164; CHECK:       # %bb.0:
165; CHECK-NEXT:    st %s9, (, %s11)
166; CHECK-NEXT:    st %s10, 8(, %s11)
167; CHECK-NEXT:    st %s17, 40(, %s11)
168; CHECK-NEXT:    or %s9, 0, %s11
169; CHECK-NEXT:    lea %s11, -288(, %s11)
170; CHECK-NEXT:    and %s11, %s11, (59)1
171; CHECK-NEXT:    or %s17, 0, %s11
172; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB2_2
173; CHECK-NEXT:  # %bb.1:
174; CHECK-NEXT:    ld %s61, 24(, %s14)
175; CHECK-NEXT:    or %s62, 0, %s0
176; CHECK-NEXT:    lea %s63, 315
177; CHECK-NEXT:    shm.l %s63, (%s61)
178; CHECK-NEXT:    shm.l %s8, 8(%s61)
179; CHECK-NEXT:    shm.l %s11, 16(%s61)
180; CHECK-NEXT:    monc
181; CHECK-NEXT:    or %s0, 0, %s62
182; CHECK-NEXT:  .LBB2_2:
183; CHECK-NEXT:    lea %s0, 15(, %s0)
184; CHECK-NEXT:    and %s0, -16, %s0
185; CHECK-NEXT:    lea %s1, __ve_grow_stack_align@lo
186; CHECK-NEXT:    and %s1, %s1, (32)0
187; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
188; CHECK-NEXT:    or %s1, -32, (0)1
189; CHECK-NEXT:    bsic %s10, (, %s12)
190; CHECK-NEXT:    lea %s0, 240(, %s11)
191; CHECK-NEXT:    lea %s0, 31(, %s0)
192; CHECK-NEXT:    and %s1, -32, %s0
193; CHECK-NEXT:    lea %s0, fun@lo
194; CHECK-NEXT:    and %s0, %s0, (32)0
195; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s0)
196; CHECK-NEXT:    lea %s0, 256(, %s17)
197; CHECK-NEXT:    bsic %s10, (, %s12)
198; CHECK-NEXT:    or %s11, 0, %s9
199; CHECK-NEXT:    ld %s17, 40(, %s11)
200; CHECK-NEXT:    ld %s10, 8(, %s11)
201; CHECK-NEXT:    ld %s9, (, %s11)
202; CHECK-NEXT:    b.l.t (, %s10)
203;
204; PIC-LABEL: test_align32:
205; PIC:       # %bb.0:
206; PIC-NEXT:    st %s9, (, %s11)
207; PIC-NEXT:    st %s10, 8(, %s11)
208; PIC-NEXT:    st %s15, 24(, %s11)
209; PIC-NEXT:    st %s16, 32(, %s11)
210; PIC-NEXT:    st %s17, 40(, %s11)
211; PIC-NEXT:    or %s9, 0, %s11
212; PIC-NEXT:    lea %s11, -288(, %s11)
213; PIC-NEXT:    and %s11, %s11, (59)1
214; PIC-NEXT:    or %s17, 0, %s11
215; PIC-NEXT:    brge.l.t %s11, %s8, .LBB2_2
216; PIC-NEXT:  # %bb.1:
217; PIC-NEXT:    ld %s61, 24(, %s14)
218; PIC-NEXT:    or %s62, 0, %s0
219; PIC-NEXT:    lea %s63, 315
220; PIC-NEXT:    shm.l %s63, (%s61)
221; PIC-NEXT:    shm.l %s8, 8(%s61)
222; PIC-NEXT:    shm.l %s11, 16(%s61)
223; PIC-NEXT:    monc
224; PIC-NEXT:    or %s0, 0, %s62
225; PIC-NEXT:  .LBB2_2:
226; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
227; PIC-NEXT:    and %s15, %s15, (32)0
228; PIC-NEXT:    sic %s16
229; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
230; PIC-NEXT:    lea %s0, 15(, %s0)
231; PIC-NEXT:    and %s0, -16, %s0
232; PIC-NEXT:    lea %s12, __ve_grow_stack_align@plt_lo(-24)
233; PIC-NEXT:    and %s12, %s12, (32)0
234; PIC-NEXT:    sic %s16
235; PIC-NEXT:    lea.sl %s12, __ve_grow_stack_align@plt_hi(%s16, %s12)
236; PIC-NEXT:    or %s1, -32, (0)1
237; PIC-NEXT:    bsic %s10, (, %s12)
238; PIC-NEXT:    lea %s0, 240(, %s11)
239; PIC-NEXT:    lea %s0, 31(, %s0)
240; PIC-NEXT:    and %s1, -32, %s0
241; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
242; PIC-NEXT:    and %s12, %s12, (32)0
243; PIC-NEXT:    sic %s16
244; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
245; PIC-NEXT:    lea %s0, 256(, %s17)
246; PIC-NEXT:    bsic %s10, (, %s12)
247; PIC-NEXT:    or %s11, 0, %s9
248; PIC-NEXT:    ld %s17, 40(, %s11)
249; PIC-NEXT:    ld %s16, 32(, %s11)
250; PIC-NEXT:    ld %s15, 24(, %s11)
251; PIC-NEXT:    ld %s10, 8(, %s11)
252; PIC-NEXT:    ld %s9, (, %s11)
253; PIC-NEXT:    b.l.t (, %s10)
254  %3 = alloca [32 x i8], align 32
255  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3)
256  %4 = sext i32 %0 to i64
257  %5 = alloca i8, i64 %4, align 32
258  %6 = call ptr @fun(ptr nonnull %3, ptr nonnull %5)
259  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3)
260  ret ptr %6
261}
262
263; Function Attrs: nounwind
264define ptr @test_frame0_var(ptr %0, ptr %1) {
265; CHECK-LABEL: test_frame0_var:
266; CHECK:       # %bb.0:
267; CHECK-NEXT:    st %s9, (, %s11)
268; CHECK-NEXT:    st %s10, 8(, %s11)
269; CHECK-NEXT:    or %s9, 0, %s11
270; CHECK-NEXT:    lea %s11, -240(, %s11)
271; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB3_2
272; CHECK-NEXT:  # %bb.1:
273; CHECK-NEXT:    ld %s61, 24(, %s14)
274; CHECK-NEXT:    or %s62, 0, %s0
275; CHECK-NEXT:    lea %s63, 315
276; CHECK-NEXT:    shm.l %s63, (%s61)
277; CHECK-NEXT:    shm.l %s8, 8(%s61)
278; CHECK-NEXT:    shm.l %s11, 16(%s61)
279; CHECK-NEXT:    monc
280; CHECK-NEXT:    or %s0, 0, %s62
281; CHECK-NEXT:  .LBB3_2:
282; CHECK-NEXT:    lea %s2, data@lo
283; CHECK-NEXT:    and %s2, %s2, (32)0
284; CHECK-NEXT:    lea.sl %s2, data@hi(, %s2)
285; CHECK-NEXT:    ld1b.zx %s2, (, %s2)
286; CHECK-NEXT:    st1b %s2, (, %s0)
287; CHECK-NEXT:    lea %s2, fun@lo
288; CHECK-NEXT:    and %s2, %s2, (32)0
289; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s2)
290; CHECK-NEXT:    bsic %s10, (, %s12)
291; CHECK-NEXT:    or %s11, 0, %s9
292; CHECK-NEXT:    ld %s10, 8(, %s11)
293; CHECK-NEXT:    ld %s9, (, %s11)
294; CHECK-NEXT:    b.l.t (, %s10)
295;
296; PIC-LABEL: test_frame0_var:
297; PIC:       # %bb.0:
298; PIC-NEXT:    st %s9, (, %s11)
299; PIC-NEXT:    st %s10, 8(, %s11)
300; PIC-NEXT:    st %s15, 24(, %s11)
301; PIC-NEXT:    st %s16, 32(, %s11)
302; PIC-NEXT:    or %s9, 0, %s11
303; PIC-NEXT:    lea %s11, -240(, %s11)
304; PIC-NEXT:    brge.l.t %s11, %s8, .LBB3_2
305; PIC-NEXT:  # %bb.1:
306; PIC-NEXT:    ld %s61, 24(, %s14)
307; PIC-NEXT:    or %s62, 0, %s0
308; PIC-NEXT:    lea %s63, 315
309; PIC-NEXT:    shm.l %s63, (%s61)
310; PIC-NEXT:    shm.l %s8, 8(%s61)
311; PIC-NEXT:    shm.l %s11, 16(%s61)
312; PIC-NEXT:    monc
313; PIC-NEXT:    or %s0, 0, %s62
314; PIC-NEXT:  .LBB3_2:
315; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
316; PIC-NEXT:    and %s15, %s15, (32)0
317; PIC-NEXT:    sic %s16
318; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
319; PIC-NEXT:    lea %s2, data@got_lo
320; PIC-NEXT:    and %s2, %s2, (32)0
321; PIC-NEXT:    lea.sl %s2, data@got_hi(, %s2)
322; PIC-NEXT:    ld %s2, (%s2, %s15)
323; PIC-NEXT:    ld1b.zx %s2, (, %s2)
324; PIC-NEXT:    st1b %s2, (, %s0)
325; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
326; PIC-NEXT:    and %s12, %s12, (32)0
327; PIC-NEXT:    sic %s16
328; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
329; PIC-NEXT:    bsic %s10, (, %s12)
330; PIC-NEXT:    or %s11, 0, %s9
331; PIC-NEXT:    ld %s16, 32(, %s11)
332; PIC-NEXT:    ld %s15, 24(, %s11)
333; PIC-NEXT:    ld %s10, 8(, %s11)
334; PIC-NEXT:    ld %s9, (, %s11)
335; PIC-NEXT:    b.l.t (, %s10)
336  %3 = load i8, ptr @data, align 1
337  store i8 %3, ptr %0, align 1
338  %4 = tail call ptr @fun(ptr nonnull %0, ptr %1)
339  ret ptr %4
340}
341
342; Function Attrs: nounwind
343define ptr @test_frame32_var(ptr %0) {
344; CHECK-LABEL: test_frame32_var:
345; CHECK:       # %bb.0:
346; CHECK-NEXT:    st %s9, (, %s11)
347; CHECK-NEXT:    st %s10, 8(, %s11)
348; CHECK-NEXT:    or %s9, 0, %s11
349; CHECK-NEXT:    lea %s11, -272(, %s11)
350; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB4_2
351; CHECK-NEXT:  # %bb.1:
352; CHECK-NEXT:    ld %s61, 24(, %s14)
353; CHECK-NEXT:    or %s62, 0, %s0
354; CHECK-NEXT:    lea %s63, 315
355; CHECK-NEXT:    shm.l %s63, (%s61)
356; CHECK-NEXT:    shm.l %s8, 8(%s61)
357; CHECK-NEXT:    shm.l %s11, 16(%s61)
358; CHECK-NEXT:    monc
359; CHECK-NEXT:    or %s0, 0, %s62
360; CHECK-NEXT:  .LBB4_2:
361; CHECK-NEXT:    lea %s1, data@lo
362; CHECK-NEXT:    and %s1, %s1, (32)0
363; CHECK-NEXT:    lea.sl %s1, data@hi(, %s1)
364; CHECK-NEXT:    ld1b.zx %s2, (, %s1)
365; CHECK-NEXT:    or %s1, 0, %s0
366; CHECK-NEXT:    st1b %s2, 240(, %s11)
367; CHECK-NEXT:    lea %s0, fun@lo
368; CHECK-NEXT:    and %s0, %s0, (32)0
369; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s0)
370; CHECK-NEXT:    lea %s0, 240(, %s11)
371; CHECK-NEXT:    bsic %s10, (, %s12)
372; CHECK-NEXT:    or %s11, 0, %s9
373; CHECK-NEXT:    ld %s10, 8(, %s11)
374; CHECK-NEXT:    ld %s9, (, %s11)
375; CHECK-NEXT:    b.l.t (, %s10)
376;
377; PIC-LABEL: test_frame32_var:
378; PIC:       # %bb.0:
379; PIC-NEXT:    st %s9, (, %s11)
380; PIC-NEXT:    st %s10, 8(, %s11)
381; PIC-NEXT:    st %s15, 24(, %s11)
382; PIC-NEXT:    st %s16, 32(, %s11)
383; PIC-NEXT:    or %s9, 0, %s11
384; PIC-NEXT:    lea %s11, -272(, %s11)
385; PIC-NEXT:    brge.l.t %s11, %s8, .LBB4_2
386; PIC-NEXT:  # %bb.1:
387; PIC-NEXT:    ld %s61, 24(, %s14)
388; PIC-NEXT:    or %s62, 0, %s0
389; PIC-NEXT:    lea %s63, 315
390; PIC-NEXT:    shm.l %s63, (%s61)
391; PIC-NEXT:    shm.l %s8, 8(%s61)
392; PIC-NEXT:    shm.l %s11, 16(%s61)
393; PIC-NEXT:    monc
394; PIC-NEXT:    or %s0, 0, %s62
395; PIC-NEXT:  .LBB4_2:
396; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
397; PIC-NEXT:    and %s15, %s15, (32)0
398; PIC-NEXT:    sic %s16
399; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
400; PIC-NEXT:    lea %s1, data@got_lo
401; PIC-NEXT:    and %s1, %s1, (32)0
402; PIC-NEXT:    lea.sl %s1, data@got_hi(, %s1)
403; PIC-NEXT:    ld %s1, (%s1, %s15)
404; PIC-NEXT:    ld1b.zx %s2, (, %s1)
405; PIC-NEXT:    or %s1, 0, %s0
406; PIC-NEXT:    st1b %s2, 240(, %s11)
407; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
408; PIC-NEXT:    and %s12, %s12, (32)0
409; PIC-NEXT:    sic %s16
410; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
411; PIC-NEXT:    lea %s0, 240(, %s11)
412; PIC-NEXT:    bsic %s10, (, %s12)
413; PIC-NEXT:    or %s11, 0, %s9
414; PIC-NEXT:    ld %s16, 32(, %s11)
415; PIC-NEXT:    ld %s15, 24(, %s11)
416; PIC-NEXT:    ld %s10, 8(, %s11)
417; PIC-NEXT:    ld %s9, (, %s11)
418; PIC-NEXT:    b.l.t (, %s10)
419  %2 = alloca [32 x i8], align 1
420  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %2)
421  %3 = load i8, ptr @data, align 1
422  store i8 %3, ptr %2, align 1
423  %4 = call ptr @fun(ptr nonnull %2, ptr %0)
424  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %2)
425  ret ptr %4
426}
427
428; Function Attrs: nounwind
429define ptr @test_align32_var(i32 signext %0, ptr nocapture readnone %1) {
430; CHECK-LABEL: test_align32_var:
431; CHECK:       # %bb.0:
432; CHECK-NEXT:    st %s9, (, %s11)
433; CHECK-NEXT:    st %s10, 8(, %s11)
434; CHECK-NEXT:    st %s17, 40(, %s11)
435; CHECK-NEXT:    or %s9, 0, %s11
436; CHECK-NEXT:    lea %s11, -288(, %s11)
437; CHECK-NEXT:    and %s11, %s11, (59)1
438; CHECK-NEXT:    or %s17, 0, %s11
439; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB5_2
440; CHECK-NEXT:  # %bb.1:
441; CHECK-NEXT:    ld %s61, 24(, %s14)
442; CHECK-NEXT:    or %s62, 0, %s0
443; CHECK-NEXT:    lea %s63, 315
444; CHECK-NEXT:    shm.l %s63, (%s61)
445; CHECK-NEXT:    shm.l %s8, 8(%s61)
446; CHECK-NEXT:    shm.l %s11, 16(%s61)
447; CHECK-NEXT:    monc
448; CHECK-NEXT:    or %s0, 0, %s62
449; CHECK-NEXT:  .LBB5_2:
450; CHECK-NEXT:    lea %s0, 15(, %s0)
451; CHECK-NEXT:    and %s0, -16, %s0
452; CHECK-NEXT:    lea %s1, __ve_grow_stack_align@lo
453; CHECK-NEXT:    and %s1, %s1, (32)0
454; CHECK-NEXT:    lea.sl %s12, __ve_grow_stack_align@hi(, %s1)
455; CHECK-NEXT:    or %s1, -32, (0)1
456; CHECK-NEXT:    bsic %s10, (, %s12)
457; CHECK-NEXT:    lea %s0, 240(, %s11)
458; CHECK-NEXT:    lea %s1, data@lo
459; CHECK-NEXT:    and %s1, %s1, (32)0
460; CHECK-NEXT:    lea.sl %s1, data@hi(, %s1)
461; CHECK-NEXT:    ld1b.zx %s2, (, %s1)
462; CHECK-NEXT:    lea %s0, 31(, %s0)
463; CHECK-NEXT:    and %s1, -32, %s0
464; CHECK-NEXT:    st1b %s2, (, %s1)
465; CHECK-NEXT:    lea %s0, fun@lo
466; CHECK-NEXT:    and %s0, %s0, (32)0
467; CHECK-NEXT:    lea.sl %s12, fun@hi(, %s0)
468; CHECK-NEXT:    lea %s0, 256(, %s17)
469; CHECK-NEXT:    bsic %s10, (, %s12)
470; CHECK-NEXT:    or %s11, 0, %s9
471; CHECK-NEXT:    ld %s17, 40(, %s11)
472; CHECK-NEXT:    ld %s10, 8(, %s11)
473; CHECK-NEXT:    ld %s9, (, %s11)
474; CHECK-NEXT:    b.l.t (, %s10)
475;
476; PIC-LABEL: test_align32_var:
477; PIC:       # %bb.0:
478; PIC-NEXT:    st %s9, (, %s11)
479; PIC-NEXT:    st %s10, 8(, %s11)
480; PIC-NEXT:    st %s15, 24(, %s11)
481; PIC-NEXT:    st %s16, 32(, %s11)
482; PIC-NEXT:    st %s17, 40(, %s11)
483; PIC-NEXT:    or %s9, 0, %s11
484; PIC-NEXT:    lea %s11, -288(, %s11)
485; PIC-NEXT:    and %s11, %s11, (59)1
486; PIC-NEXT:    or %s17, 0, %s11
487; PIC-NEXT:    brge.l.t %s11, %s8, .LBB5_2
488; PIC-NEXT:  # %bb.1:
489; PIC-NEXT:    ld %s61, 24(, %s14)
490; PIC-NEXT:    or %s62, 0, %s0
491; PIC-NEXT:    lea %s63, 315
492; PIC-NEXT:    shm.l %s63, (%s61)
493; PIC-NEXT:    shm.l %s8, 8(%s61)
494; PIC-NEXT:    shm.l %s11, 16(%s61)
495; PIC-NEXT:    monc
496; PIC-NEXT:    or %s0, 0, %s62
497; PIC-NEXT:  .LBB5_2:
498; PIC-NEXT:    lea %s15, _GLOBAL_OFFSET_TABLE_@pc_lo(-24)
499; PIC-NEXT:    and %s15, %s15, (32)0
500; PIC-NEXT:    sic %s16
501; PIC-NEXT:    lea.sl %s15, _GLOBAL_OFFSET_TABLE_@pc_hi(%s16, %s15)
502; PIC-NEXT:    lea %s0, 15(, %s0)
503; PIC-NEXT:    and %s0, -16, %s0
504; PIC-NEXT:    lea %s12, __ve_grow_stack_align@plt_lo(-24)
505; PIC-NEXT:    and %s12, %s12, (32)0
506; PIC-NEXT:    sic %s16
507; PIC-NEXT:    lea.sl %s12, __ve_grow_stack_align@plt_hi(%s16, %s12)
508; PIC-NEXT:    or %s1, -32, (0)1
509; PIC-NEXT:    bsic %s10, (, %s12)
510; PIC-NEXT:    lea %s0, data@got_lo
511; PIC-NEXT:    and %s0, %s0, (32)0
512; PIC-NEXT:    lea.sl %s0, data@got_hi(, %s0)
513; PIC-NEXT:    ld %s0, (%s0, %s15)
514; PIC-NEXT:    lea %s1, 240(, %s11)
515; PIC-NEXT:    ld1b.zx %s0, (, %s0)
516; PIC-NEXT:    lea %s1, 31(, %s1)
517; PIC-NEXT:    and %s1, -32, %s1
518; PIC-NEXT:    st1b %s0, (, %s1)
519; PIC-NEXT:    lea %s12, fun@plt_lo(-24)
520; PIC-NEXT:    and %s12, %s12, (32)0
521; PIC-NEXT:    sic %s16
522; PIC-NEXT:    lea.sl %s12, fun@plt_hi(%s16, %s12)
523; PIC-NEXT:    lea %s0, 256(, %s17)
524; PIC-NEXT:    bsic %s10, (, %s12)
525; PIC-NEXT:    or %s11, 0, %s9
526; PIC-NEXT:    ld %s17, 40(, %s11)
527; PIC-NEXT:    ld %s16, 32(, %s11)
528; PIC-NEXT:    ld %s15, 24(, %s11)
529; PIC-NEXT:    ld %s10, 8(, %s11)
530; PIC-NEXT:    ld %s9, (, %s11)
531; PIC-NEXT:    b.l.t (, %s10)
532  %3 = alloca [32 x i8], align 32
533  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %3)
534  %4 = sext i32 %0 to i64
535  %5 = alloca i8, i64 %4, align 32
536  %6 = load i8, ptr @data, align 1
537  store i8 %6, ptr %5, align 32
538  %7 = call ptr @fun(ptr nonnull %3, ptr nonnull %5)
539  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %3)
540  ret ptr %7
541}
542