blob: 7af02b54e65a7542e42e6326cd35acc30c13ee70 [file] [log] [blame]
Hsiangkai Wang04ddf392019-06-12 03:04:22 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefix=RV32 %s
3; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefix=RV64 %s
Luís Marquesbe0fead2019-11-10 15:56:51 +00004; RUN: llc -mtriple=riscv32 -frame-pointer=all -verify-machineinstrs < %s \
5; RUN: | FileCheck -check-prefix=RV32-WITHFP %s
6; RUN: llc -mtriple=riscv64 -frame-pointer=all -verify-machineinstrs < %s \
7; RUN: | FileCheck -check-prefix=RV64-WITHFP %s
Hsiangkai Wang04ddf392019-06-12 03:04:22 +00008
Luís Marquesbe0fead2019-11-10 15:56:51 +00009define void @trivial() {
10; RV32-LABEL: trivial:
11; RV32: # %bb.0:
12; RV32-NEXT: .cfi_def_cfa_offset 0
13; RV32-NEXT: ret
14;
15; RV64-LABEL: trivial:
16; RV64: # %bb.0:
17; RV64-NEXT: .cfi_def_cfa_offset 0
18; RV64-NEXT: ret
19;
20; RV32-WITHFP-LABEL: trivial:
21; RV32-WITHFP: # %bb.0:
22; RV32-WITHFP-NEXT: addi sp, sp, -16
23; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16
24; RV32-WITHFP-NEXT: sw ra, 12(sp)
25; RV32-WITHFP-NEXT: sw s0, 8(sp)
26; RV32-WITHFP-NEXT: .cfi_offset ra, -4
27; RV32-WITHFP-NEXT: .cfi_offset s0, -8
28; RV32-WITHFP-NEXT: addi s0, sp, 16
29; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0
30; RV32-WITHFP-NEXT: lw s0, 8(sp)
31; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16
32; RV32-WITHFP-NEXT: lw ra, 12(sp)
33; RV32-WITHFP-NEXT: .cfi_restore ra
34; RV32-WITHFP-NEXT: .cfi_restore s0
35; RV32-WITHFP-NEXT: addi sp, sp, 16
36; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0
37; RV32-WITHFP-NEXT: ret
38;
39; RV64-WITHFP-LABEL: trivial:
40; RV64-WITHFP: # %bb.0:
41; RV64-WITHFP-NEXT: addi sp, sp, -16
42; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16
43; RV64-WITHFP-NEXT: sd ra, 8(sp)
44; RV64-WITHFP-NEXT: sd s0, 0(sp)
45; RV64-WITHFP-NEXT: .cfi_offset ra, -8
46; RV64-WITHFP-NEXT: .cfi_offset s0, -16
47; RV64-WITHFP-NEXT: addi s0, sp, 16
48; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0
49; RV64-WITHFP-NEXT: ld s0, 0(sp)
50; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16
51; RV64-WITHFP-NEXT: ld ra, 8(sp)
52; RV64-WITHFP-NEXT: .cfi_restore ra
53; RV64-WITHFP-NEXT: .cfi_restore s0
54; RV64-WITHFP-NEXT: addi sp, sp, 16
55; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0
56; RV64-WITHFP-NEXT: ret
57 ret void
58}
59
60define void @stack_alloc(i32 signext %size) {
61; RV32-LABEL: stack_alloc:
Hsiangkai Wang04ddf392019-06-12 03:04:22 +000062; RV32: # %bb.0: # %entry
63; RV32-NEXT: addi sp, sp, -16
64; RV32-NEXT: .cfi_def_cfa_offset 16
65; RV32-NEXT: sw ra, 12(sp)
66; RV32-NEXT: sw s0, 8(sp)
67; RV32-NEXT: .cfi_offset ra, -4
68; RV32-NEXT: .cfi_offset s0, -8
69; RV32-NEXT: addi s0, sp, 16
70; RV32-NEXT: .cfi_def_cfa s0, 0
71; RV32-NEXT: addi a0, a0, 15
72; RV32-NEXT: andi a0, a0, -16
73; RV32-NEXT: sub a0, sp, a0
74; RV32-NEXT: mv sp, a0
Luís Marquesbe0fead2019-11-10 15:56:51 +000075; RV32-NEXT: call callee_with_args
Hsiangkai Wang04ddf392019-06-12 03:04:22 +000076; RV32-NEXT: addi sp, s0, -16
77; RV32-NEXT: lw s0, 8(sp)
78; RV32-NEXT: .cfi_def_cfa sp, 16
79; RV32-NEXT: lw ra, 12(sp)
80; RV32-NEXT: .cfi_restore ra
81; RV32-NEXT: .cfi_restore s0
82; RV32-NEXT: addi sp, sp, 16
83; RV32-NEXT: .cfi_def_cfa_offset 0
84; RV32-NEXT: ret
85;
Luís Marquesbe0fead2019-11-10 15:56:51 +000086; RV64-LABEL: stack_alloc:
Hsiangkai Wang04ddf392019-06-12 03:04:22 +000087; RV64: # %bb.0: # %entry
88; RV64-NEXT: addi sp, sp, -16
89; RV64-NEXT: .cfi_def_cfa_offset 16
90; RV64-NEXT: sd ra, 8(sp)
91; RV64-NEXT: sd s0, 0(sp)
92; RV64-NEXT: .cfi_offset ra, -8
93; RV64-NEXT: .cfi_offset s0, -16
94; RV64-NEXT: addi s0, sp, 16
95; RV64-NEXT: .cfi_def_cfa s0, 0
Luis Marques2d550d12019-09-17 10:52:09 +000096; RV64-NEXT: slli a0, a0, 32
97; RV64-NEXT: srli a0, a0, 32
98; RV64-NEXT: addi a0, a0, 15
Luis Marques3d0fbaf2019-09-17 11:15:35 +000099; RV64-NEXT: addi a1, zero, 1
100; RV64-NEXT: slli a1, a1, 33
101; RV64-NEXT: addi a1, a1, -16
Hsiangkai Wang04ddf392019-06-12 03:04:22 +0000102; RV64-NEXT: and a0, a0, a1
103; RV64-NEXT: sub a0, sp, a0
104; RV64-NEXT: mv sp, a0
Luís Marquesbe0fead2019-11-10 15:56:51 +0000105; RV64-NEXT: call callee_with_args
Hsiangkai Wang04ddf392019-06-12 03:04:22 +0000106; RV64-NEXT: addi sp, s0, -16
107; RV64-NEXT: ld s0, 0(sp)
108; RV64-NEXT: .cfi_def_cfa sp, 16
109; RV64-NEXT: ld ra, 8(sp)
110; RV64-NEXT: .cfi_restore ra
111; RV64-NEXT: .cfi_restore s0
112; RV64-NEXT: addi sp, sp, 16
113; RV64-NEXT: .cfi_def_cfa_offset 0
114; RV64-NEXT: ret
Luís Marquesbe0fead2019-11-10 15:56:51 +0000115;
116; RV32-WITHFP-LABEL: stack_alloc:
117; RV32-WITHFP: # %bb.0: # %entry
118; RV32-WITHFP-NEXT: addi sp, sp, -16
119; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16
120; RV32-WITHFP-NEXT: sw ra, 12(sp)
121; RV32-WITHFP-NEXT: sw s0, 8(sp)
122; RV32-WITHFP-NEXT: .cfi_offset ra, -4
123; RV32-WITHFP-NEXT: .cfi_offset s0, -8
124; RV32-WITHFP-NEXT: addi s0, sp, 16
125; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0
126; RV32-WITHFP-NEXT: addi a0, a0, 15
127; RV32-WITHFP-NEXT: andi a0, a0, -16
128; RV32-WITHFP-NEXT: sub a0, sp, a0
129; RV32-WITHFP-NEXT: mv sp, a0
130; RV32-WITHFP-NEXT: call callee_with_args
131; RV32-WITHFP-NEXT: addi sp, s0, -16
132; RV32-WITHFP-NEXT: lw s0, 8(sp)
133; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16
134; RV32-WITHFP-NEXT: lw ra, 12(sp)
135; RV32-WITHFP-NEXT: .cfi_restore ra
136; RV32-WITHFP-NEXT: .cfi_restore s0
137; RV32-WITHFP-NEXT: addi sp, sp, 16
138; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0
139; RV32-WITHFP-NEXT: ret
140;
141; RV64-WITHFP-LABEL: stack_alloc:
142; RV64-WITHFP: # %bb.0: # %entry
143; RV64-WITHFP-NEXT: addi sp, sp, -16
144; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16
145; RV64-WITHFP-NEXT: sd ra, 8(sp)
146; RV64-WITHFP-NEXT: sd s0, 0(sp)
147; RV64-WITHFP-NEXT: .cfi_offset ra, -8
148; RV64-WITHFP-NEXT: .cfi_offset s0, -16
149; RV64-WITHFP-NEXT: addi s0, sp, 16
150; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0
151; RV64-WITHFP-NEXT: slli a0, a0, 32
152; RV64-WITHFP-NEXT: srli a0, a0, 32
153; RV64-WITHFP-NEXT: addi a0, a0, 15
154; RV64-WITHFP-NEXT: addi a1, zero, 1
155; RV64-WITHFP-NEXT: slli a1, a1, 33
156; RV64-WITHFP-NEXT: addi a1, a1, -16
157; RV64-WITHFP-NEXT: and a0, a0, a1
158; RV64-WITHFP-NEXT: sub a0, sp, a0
159; RV64-WITHFP-NEXT: mv sp, a0
160; RV64-WITHFP-NEXT: call callee_with_args
161; RV64-WITHFP-NEXT: addi sp, s0, -16
162; RV64-WITHFP-NEXT: ld s0, 0(sp)
163; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16
164; RV64-WITHFP-NEXT: ld ra, 8(sp)
165; RV64-WITHFP-NEXT: .cfi_restore ra
166; RV64-WITHFP-NEXT: .cfi_restore s0
167; RV64-WITHFP-NEXT: addi sp, sp, 16
168; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0
169; RV64-WITHFP-NEXT: ret
Hsiangkai Wang04ddf392019-06-12 03:04:22 +0000170entry:
171 %0 = alloca i8, i32 %size, align 16
Luís Marquesbe0fead2019-11-10 15:56:51 +0000172 call void @callee_with_args(i8* nonnull %0) #2
Hsiangkai Wang04ddf392019-06-12 03:04:22 +0000173 ret void
174}
175
Luís Marquesbe0fead2019-11-10 15:56:51 +0000176; FIXME: fix use of .cfi_restore with wrong CFAs
177
178define void @branch_and_tail_call(i1 %a) {
179; RV32-LABEL: branch_and_tail_call:
180; RV32: # %bb.0:
181; RV32-NEXT: addi sp, sp, -16
182; RV32-NEXT: .cfi_def_cfa_offset 16
183; RV32-NEXT: sw ra, 12(sp)
184; RV32-NEXT: .cfi_offset ra, -4
185; RV32-NEXT: andi a0, a0, 1
186; RV32-NEXT: beqz a0, .LBB2_2
187; RV32-NEXT: # %bb.1: # %blue_pill
188; RV32-NEXT: lw ra, 12(sp)
189; RV32-NEXT: .cfi_restore ra
190; RV32-NEXT: addi sp, sp, 16
191; RV32-NEXT: .cfi_def_cfa_offset 0
192; RV32-NEXT: tail callee1
193; RV32-NEXT: .LBB2_2: # %red_pill
194; RV32-NEXT: call callee2
195; RV32-NEXT: lw ra, 12(sp)
196; RV32-NEXT: .cfi_restore ra
197; RV32-NEXT: addi sp, sp, 16
198; RV32-NEXT: .cfi_def_cfa_offset 0
199; RV32-NEXT: ret
200;
201; RV64-LABEL: branch_and_tail_call:
202; RV64: # %bb.0:
203; RV64-NEXT: addi sp, sp, -16
204; RV64-NEXT: .cfi_def_cfa_offset 16
205; RV64-NEXT: sd ra, 8(sp)
206; RV64-NEXT: .cfi_offset ra, -8
207; RV64-NEXT: andi a0, a0, 1
208; RV64-NEXT: beqz a0, .LBB2_2
209; RV64-NEXT: # %bb.1: # %blue_pill
210; RV64-NEXT: ld ra, 8(sp)
211; RV64-NEXT: .cfi_restore ra
212; RV64-NEXT: addi sp, sp, 16
213; RV64-NEXT: .cfi_def_cfa_offset 0
214; RV64-NEXT: tail callee1
215; RV64-NEXT: .LBB2_2: # %red_pill
216; RV64-NEXT: call callee2
217; RV64-NEXT: ld ra, 8(sp)
218; RV64-NEXT: .cfi_restore ra
219; RV64-NEXT: addi sp, sp, 16
220; RV64-NEXT: .cfi_def_cfa_offset 0
221; RV64-NEXT: ret
222;
223; RV32-WITHFP-LABEL: branch_and_tail_call:
224; RV32-WITHFP: # %bb.0:
225; RV32-WITHFP-NEXT: addi sp, sp, -16
226; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 16
227; RV32-WITHFP-NEXT: sw ra, 12(sp)
228; RV32-WITHFP-NEXT: sw s0, 8(sp)
229; RV32-WITHFP-NEXT: .cfi_offset ra, -4
230; RV32-WITHFP-NEXT: .cfi_offset s0, -8
231; RV32-WITHFP-NEXT: addi s0, sp, 16
232; RV32-WITHFP-NEXT: .cfi_def_cfa s0, 0
233; RV32-WITHFP-NEXT: andi a0, a0, 1
234; RV32-WITHFP-NEXT: beqz a0, .LBB2_2
235; RV32-WITHFP-NEXT: # %bb.1: # %blue_pill
236; RV32-WITHFP-NEXT: lw s0, 8(sp)
237; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16
238; RV32-WITHFP-NEXT: lw ra, 12(sp)
239; RV32-WITHFP-NEXT: .cfi_restore ra
240; RV32-WITHFP-NEXT: .cfi_restore s0
241; RV32-WITHFP-NEXT: addi sp, sp, 16
242; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0
243; RV32-WITHFP-NEXT: tail callee1
244; RV32-WITHFP-NEXT: .LBB2_2: # %red_pill
245; RV32-WITHFP-NEXT: call callee2
246; RV32-WITHFP-NEXT: lw s0, 8(sp)
247; RV32-WITHFP-NEXT: .cfi_def_cfa sp, 16
248; RV32-WITHFP-NEXT: lw ra, 12(sp)
249; RV32-WITHFP-NEXT: .cfi_restore ra
250; RV32-WITHFP-NEXT: .cfi_restore s0
251; RV32-WITHFP-NEXT: addi sp, sp, 16
252; RV32-WITHFP-NEXT: .cfi_def_cfa_offset 0
253; RV32-WITHFP-NEXT: ret
254;
255; RV64-WITHFP-LABEL: branch_and_tail_call:
256; RV64-WITHFP: # %bb.0:
257; RV64-WITHFP-NEXT: addi sp, sp, -16
258; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 16
259; RV64-WITHFP-NEXT: sd ra, 8(sp)
260; RV64-WITHFP-NEXT: sd s0, 0(sp)
261; RV64-WITHFP-NEXT: .cfi_offset ra, -8
262; RV64-WITHFP-NEXT: .cfi_offset s0, -16
263; RV64-WITHFP-NEXT: addi s0, sp, 16
264; RV64-WITHFP-NEXT: .cfi_def_cfa s0, 0
265; RV64-WITHFP-NEXT: andi a0, a0, 1
266; RV64-WITHFP-NEXT: beqz a0, .LBB2_2
267; RV64-WITHFP-NEXT: # %bb.1: # %blue_pill
268; RV64-WITHFP-NEXT: ld s0, 0(sp)
269; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16
270; RV64-WITHFP-NEXT: ld ra, 8(sp)
271; RV64-WITHFP-NEXT: .cfi_restore ra
272; RV64-WITHFP-NEXT: .cfi_restore s0
273; RV64-WITHFP-NEXT: addi sp, sp, 16
274; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0
275; RV64-WITHFP-NEXT: tail callee1
276; RV64-WITHFP-NEXT: .LBB2_2: # %red_pill
277; RV64-WITHFP-NEXT: call callee2
278; RV64-WITHFP-NEXT: ld s0, 0(sp)
279; RV64-WITHFP-NEXT: .cfi_def_cfa sp, 16
280; RV64-WITHFP-NEXT: ld ra, 8(sp)
281; RV64-WITHFP-NEXT: .cfi_restore ra
282; RV64-WITHFP-NEXT: .cfi_restore s0
283; RV64-WITHFP-NEXT: addi sp, sp, 16
284; RV64-WITHFP-NEXT: .cfi_def_cfa_offset 0
285; RV64-WITHFP-NEXT: ret
286 br i1 %a, label %blue_pill, label %red_pill
287blue_pill:
288 tail call void @callee1()
289 ret void
290red_pill:
291 call void @callee2()
292 ret void
293}
294
295declare void @callee1()
296declare void @callee2()
297declare void @callee_with_args(i8*)