xref: /llvm-project/llvm/test/CodeGen/RISCV/frame-info.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 < %s \
3; RUN:   | FileCheck -check-prefix=RV32 %s
4; RUN: llc -mtriple=riscv64 < %s \
5; RUN:   | FileCheck -check-prefix=RV64 %s
6; RUN: llc -mtriple=riscv32 -frame-pointer=all -verify-machineinstrs < %s \
7; RUN:   | FileCheck -check-prefix=RV32-WITHFP %s
8; RUN: llc -mtriple=riscv64 -frame-pointer=all -verify-machineinstrs < %s \
9; RUN:   | FileCheck -check-prefix=RV64-WITHFP %s
10
11; RUN: llc -mtriple=riscv32 --enable-shrink-wrap=false < %s \
12; RUN:   | FileCheck -check-prefix=RV32-DISABLESW %s
13; RUN: llc -mtriple=riscv64 --enable-shrink-wrap=false < %s \
14; RUN:   | FileCheck -check-prefix=RV64-DISABLESW %s
15; RUN: llc -mtriple=riscv32 -frame-pointer=all --enable-shrink-wrap=false -verify-machineinstrs < %s \
16; RUN:   | FileCheck -check-prefix=RV32-WITHFP-DISABLESW %s
17; RUN: llc -mtriple=riscv64 -frame-pointer=all --enable-shrink-wrap=false -verify-machineinstrs < %s \
18; RUN:   | FileCheck -check-prefix=RV64-WITHFP-DISABLESW %s
19
20define void @trivial() {
21; RV32-LABEL: trivial:
22; RV32:       # %bb.0:
23; RV32-NEXT:    ret
24;
25; RV64-LABEL: trivial:
26; RV64:       # %bb.0:
27; RV64-NEXT:    ret
28;
29; RV32-WITHFP-LABEL: trivial:
30; RV32-WITHFP:       # %bb.0:
31; RV32-WITHFP-NEXT:    addi sp, sp, -16
32; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 16
33; RV32-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
34; RV32-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
35; RV32-WITHFP-NEXT:    .cfi_offset ra, -4
36; RV32-WITHFP-NEXT:    .cfi_offset s0, -8
37; RV32-WITHFP-NEXT:    addi s0, sp, 16
38; RV32-WITHFP-NEXT:    .cfi_def_cfa s0, 0
39; RV32-WITHFP-NEXT:    .cfi_def_cfa sp, 16
40; RV32-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
41; RV32-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
42; RV32-WITHFP-NEXT:    .cfi_restore ra
43; RV32-WITHFP-NEXT:    .cfi_restore s0
44; RV32-WITHFP-NEXT:    addi sp, sp, 16
45; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 0
46; RV32-WITHFP-NEXT:    ret
47;
48; RV64-WITHFP-LABEL: trivial:
49; RV64-WITHFP:       # %bb.0:
50; RV64-WITHFP-NEXT:    addi sp, sp, -16
51; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 16
52; RV64-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
53; RV64-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
54; RV64-WITHFP-NEXT:    .cfi_offset ra, -8
55; RV64-WITHFP-NEXT:    .cfi_offset s0, -16
56; RV64-WITHFP-NEXT:    addi s0, sp, 16
57; RV64-WITHFP-NEXT:    .cfi_def_cfa s0, 0
58; RV64-WITHFP-NEXT:    .cfi_def_cfa sp, 16
59; RV64-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
60; RV64-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
61; RV64-WITHFP-NEXT:    .cfi_restore ra
62; RV64-WITHFP-NEXT:    .cfi_restore s0
63; RV64-WITHFP-NEXT:    addi sp, sp, 16
64; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 0
65; RV64-WITHFP-NEXT:    ret
66;
67; RV32-DISABLESW-LABEL: trivial:
68; RV32-DISABLESW:       # %bb.0:
69; RV32-DISABLESW-NEXT:    ret
70;
71; RV64-DISABLESW-LABEL: trivial:
72; RV64-DISABLESW:       # %bb.0:
73; RV64-DISABLESW-NEXT:    ret
74;
75; RV32-WITHFP-DISABLESW-LABEL: trivial:
76; RV32-WITHFP-DISABLESW:       # %bb.0:
77; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
78; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
79; RV32-WITHFP-DISABLESW-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
80; RV32-WITHFP-DISABLESW-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
81; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -4
82; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -8
83; RV32-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
84; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
85; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
86; RV32-WITHFP-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
87; RV32-WITHFP-DISABLESW-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
88; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
89; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
90; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
91; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
92; RV32-WITHFP-DISABLESW-NEXT:    ret
93;
94; RV64-WITHFP-DISABLESW-LABEL: trivial:
95; RV64-WITHFP-DISABLESW:       # %bb.0:
96; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
97; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
98; RV64-WITHFP-DISABLESW-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
99; RV64-WITHFP-DISABLESW-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
100; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -8
101; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -16
102; RV64-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
103; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
104; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
105; RV64-WITHFP-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
106; RV64-WITHFP-DISABLESW-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
107; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
108; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
109; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
110; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
111; RV64-WITHFP-DISABLESW-NEXT:    ret
112  ret void
113}
114
115define void @stack_alloc(i32 signext %size) {
116; RV32-LABEL: stack_alloc:
117; RV32:       # %bb.0: # %entry
118; RV32-NEXT:    addi sp, sp, -16
119; RV32-NEXT:    .cfi_def_cfa_offset 16
120; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
121; RV32-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
122; RV32-NEXT:    .cfi_offset ra, -4
123; RV32-NEXT:    .cfi_offset s0, -8
124; RV32-NEXT:    addi s0, sp, 16
125; RV32-NEXT:    .cfi_def_cfa s0, 0
126; RV32-NEXT:    addi a0, a0, 15
127; RV32-NEXT:    andi a0, a0, -16
128; RV32-NEXT:    sub a0, sp, a0
129; RV32-NEXT:    mv sp, a0
130; RV32-NEXT:    call callee_with_args
131; RV32-NEXT:    addi sp, s0, -16
132; RV32-NEXT:    .cfi_def_cfa sp, 16
133; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
134; RV32-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
135; RV32-NEXT:    .cfi_restore ra
136; RV32-NEXT:    .cfi_restore s0
137; RV32-NEXT:    addi sp, sp, 16
138; RV32-NEXT:    .cfi_def_cfa_offset 0
139; RV32-NEXT:    ret
140;
141; RV64-LABEL: stack_alloc:
142; RV64:       # %bb.0: # %entry
143; RV64-NEXT:    addi sp, sp, -16
144; RV64-NEXT:    .cfi_def_cfa_offset 16
145; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
146; RV64-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
147; RV64-NEXT:    .cfi_offset ra, -8
148; RV64-NEXT:    .cfi_offset s0, -16
149; RV64-NEXT:    addi s0, sp, 16
150; RV64-NEXT:    .cfi_def_cfa s0, 0
151; RV64-NEXT:    slli a0, a0, 32
152; RV64-NEXT:    srli a0, a0, 32
153; RV64-NEXT:    addi a0, a0, 15
154; RV64-NEXT:    andi a0, a0, -16
155; RV64-NEXT:    sub a0, sp, a0
156; RV64-NEXT:    mv sp, a0
157; RV64-NEXT:    call callee_with_args
158; RV64-NEXT:    addi sp, s0, -16
159; RV64-NEXT:    .cfi_def_cfa sp, 16
160; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
161; RV64-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
162; RV64-NEXT:    .cfi_restore ra
163; RV64-NEXT:    .cfi_restore s0
164; RV64-NEXT:    addi sp, sp, 16
165; RV64-NEXT:    .cfi_def_cfa_offset 0
166; RV64-NEXT:    ret
167;
168; RV32-WITHFP-LABEL: stack_alloc:
169; RV32-WITHFP:       # %bb.0: # %entry
170; RV32-WITHFP-NEXT:    addi sp, sp, -16
171; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 16
172; RV32-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
173; RV32-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
174; RV32-WITHFP-NEXT:    .cfi_offset ra, -4
175; RV32-WITHFP-NEXT:    .cfi_offset s0, -8
176; RV32-WITHFP-NEXT:    addi s0, sp, 16
177; RV32-WITHFP-NEXT:    .cfi_def_cfa s0, 0
178; RV32-WITHFP-NEXT:    addi a0, a0, 15
179; RV32-WITHFP-NEXT:    andi a0, a0, -16
180; RV32-WITHFP-NEXT:    sub a0, sp, a0
181; RV32-WITHFP-NEXT:    mv sp, a0
182; RV32-WITHFP-NEXT:    call callee_with_args
183; RV32-WITHFP-NEXT:    addi sp, s0, -16
184; RV32-WITHFP-NEXT:    .cfi_def_cfa sp, 16
185; RV32-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
186; RV32-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
187; RV32-WITHFP-NEXT:    .cfi_restore ra
188; RV32-WITHFP-NEXT:    .cfi_restore s0
189; RV32-WITHFP-NEXT:    addi sp, sp, 16
190; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 0
191; RV32-WITHFP-NEXT:    ret
192;
193; RV64-WITHFP-LABEL: stack_alloc:
194; RV64-WITHFP:       # %bb.0: # %entry
195; RV64-WITHFP-NEXT:    addi sp, sp, -16
196; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 16
197; RV64-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
198; RV64-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
199; RV64-WITHFP-NEXT:    .cfi_offset ra, -8
200; RV64-WITHFP-NEXT:    .cfi_offset s0, -16
201; RV64-WITHFP-NEXT:    addi s0, sp, 16
202; RV64-WITHFP-NEXT:    .cfi_def_cfa s0, 0
203; RV64-WITHFP-NEXT:    slli a0, a0, 32
204; RV64-WITHFP-NEXT:    srli a0, a0, 32
205; RV64-WITHFP-NEXT:    addi a0, a0, 15
206; RV64-WITHFP-NEXT:    andi a0, a0, -16
207; RV64-WITHFP-NEXT:    sub a0, sp, a0
208; RV64-WITHFP-NEXT:    mv sp, a0
209; RV64-WITHFP-NEXT:    call callee_with_args
210; RV64-WITHFP-NEXT:    addi sp, s0, -16
211; RV64-WITHFP-NEXT:    .cfi_def_cfa sp, 16
212; RV64-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
213; RV64-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
214; RV64-WITHFP-NEXT:    .cfi_restore ra
215; RV64-WITHFP-NEXT:    .cfi_restore s0
216; RV64-WITHFP-NEXT:    addi sp, sp, 16
217; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 0
218; RV64-WITHFP-NEXT:    ret
219;
220; RV32-DISABLESW-LABEL: stack_alloc:
221; RV32-DISABLESW:       # %bb.0: # %entry
222; RV32-DISABLESW-NEXT:    addi sp, sp, -16
223; RV32-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
224; RV32-DISABLESW-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
225; RV32-DISABLESW-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
226; RV32-DISABLESW-NEXT:    .cfi_offset ra, -4
227; RV32-DISABLESW-NEXT:    .cfi_offset s0, -8
228; RV32-DISABLESW-NEXT:    addi s0, sp, 16
229; RV32-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
230; RV32-DISABLESW-NEXT:    addi a0, a0, 15
231; RV32-DISABLESW-NEXT:    andi a0, a0, -16
232; RV32-DISABLESW-NEXT:    sub a0, sp, a0
233; RV32-DISABLESW-NEXT:    mv sp, a0
234; RV32-DISABLESW-NEXT:    call callee_with_args
235; RV32-DISABLESW-NEXT:    addi sp, s0, -16
236; RV32-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
237; RV32-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
238; RV32-DISABLESW-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
239; RV32-DISABLESW-NEXT:    .cfi_restore ra
240; RV32-DISABLESW-NEXT:    .cfi_restore s0
241; RV32-DISABLESW-NEXT:    addi sp, sp, 16
242; RV32-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
243; RV32-DISABLESW-NEXT:    ret
244;
245; RV64-DISABLESW-LABEL: stack_alloc:
246; RV64-DISABLESW:       # %bb.0: # %entry
247; RV64-DISABLESW-NEXT:    addi sp, sp, -16
248; RV64-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
249; RV64-DISABLESW-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
250; RV64-DISABLESW-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
251; RV64-DISABLESW-NEXT:    .cfi_offset ra, -8
252; RV64-DISABLESW-NEXT:    .cfi_offset s0, -16
253; RV64-DISABLESW-NEXT:    addi s0, sp, 16
254; RV64-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
255; RV64-DISABLESW-NEXT:    slli a0, a0, 32
256; RV64-DISABLESW-NEXT:    srli a0, a0, 32
257; RV64-DISABLESW-NEXT:    addi a0, a0, 15
258; RV64-DISABLESW-NEXT:    andi a0, a0, -16
259; RV64-DISABLESW-NEXT:    sub a0, sp, a0
260; RV64-DISABLESW-NEXT:    mv sp, a0
261; RV64-DISABLESW-NEXT:    call callee_with_args
262; RV64-DISABLESW-NEXT:    addi sp, s0, -16
263; RV64-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
264; RV64-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
265; RV64-DISABLESW-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
266; RV64-DISABLESW-NEXT:    .cfi_restore ra
267; RV64-DISABLESW-NEXT:    .cfi_restore s0
268; RV64-DISABLESW-NEXT:    addi sp, sp, 16
269; RV64-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
270; RV64-DISABLESW-NEXT:    ret
271;
272; RV32-WITHFP-DISABLESW-LABEL: stack_alloc:
273; RV32-WITHFP-DISABLESW:       # %bb.0: # %entry
274; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
275; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
276; RV32-WITHFP-DISABLESW-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
277; RV32-WITHFP-DISABLESW-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
278; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -4
279; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -8
280; RV32-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
281; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
282; RV32-WITHFP-DISABLESW-NEXT:    addi a0, a0, 15
283; RV32-WITHFP-DISABLESW-NEXT:    andi a0, a0, -16
284; RV32-WITHFP-DISABLESW-NEXT:    sub a0, sp, a0
285; RV32-WITHFP-DISABLESW-NEXT:    mv sp, a0
286; RV32-WITHFP-DISABLESW-NEXT:    call callee_with_args
287; RV32-WITHFP-DISABLESW-NEXT:    addi sp, s0, -16
288; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
289; RV32-WITHFP-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
290; RV32-WITHFP-DISABLESW-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
291; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
292; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
293; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
294; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
295; RV32-WITHFP-DISABLESW-NEXT:    ret
296;
297; RV64-WITHFP-DISABLESW-LABEL: stack_alloc:
298; RV64-WITHFP-DISABLESW:       # %bb.0: # %entry
299; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
300; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
301; RV64-WITHFP-DISABLESW-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
302; RV64-WITHFP-DISABLESW-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
303; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -8
304; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -16
305; RV64-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
306; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
307; RV64-WITHFP-DISABLESW-NEXT:    slli a0, a0, 32
308; RV64-WITHFP-DISABLESW-NEXT:    srli a0, a0, 32
309; RV64-WITHFP-DISABLESW-NEXT:    addi a0, a0, 15
310; RV64-WITHFP-DISABLESW-NEXT:    andi a0, a0, -16
311; RV64-WITHFP-DISABLESW-NEXT:    sub a0, sp, a0
312; RV64-WITHFP-DISABLESW-NEXT:    mv sp, a0
313; RV64-WITHFP-DISABLESW-NEXT:    call callee_with_args
314; RV64-WITHFP-DISABLESW-NEXT:    addi sp, s0, -16
315; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
316; RV64-WITHFP-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
317; RV64-WITHFP-DISABLESW-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
318; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
319; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
320; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
321; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
322; RV64-WITHFP-DISABLESW-NEXT:    ret
323entry:
324  %0 = alloca i8, i32 %size, align 16
325  call void @callee_with_args(ptr nonnull %0)
326  ret void
327}
328
329define void @branch_and_tail_call(i1 %a) {
330; RV32-LABEL: branch_and_tail_call:
331; RV32:       # %bb.0:
332; RV32-NEXT:    andi a0, a0, 1
333; RV32-NEXT:    beqz a0, .LBB2_2
334; RV32-NEXT:  # %bb.1: # %blue_pill
335; RV32-NEXT:    tail callee1
336; RV32-NEXT:  .LBB2_2: # %red_pill
337; RV32-NEXT:    addi sp, sp, -16
338; RV32-NEXT:    .cfi_def_cfa_offset 16
339; RV32-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
340; RV32-NEXT:    .cfi_offset ra, -4
341; RV32-NEXT:    call callee2
342; RV32-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
343; RV32-NEXT:    .cfi_restore ra
344; RV32-NEXT:    addi sp, sp, 16
345; RV32-NEXT:    .cfi_def_cfa_offset 0
346; RV32-NEXT:    ret
347;
348; RV64-LABEL: branch_and_tail_call:
349; RV64:       # %bb.0:
350; RV64-NEXT:    andi a0, a0, 1
351; RV64-NEXT:    beqz a0, .LBB2_2
352; RV64-NEXT:  # %bb.1: # %blue_pill
353; RV64-NEXT:    tail callee1
354; RV64-NEXT:  .LBB2_2: # %red_pill
355; RV64-NEXT:    addi sp, sp, -16
356; RV64-NEXT:    .cfi_def_cfa_offset 16
357; RV64-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
358; RV64-NEXT:    .cfi_offset ra, -8
359; RV64-NEXT:    call callee2
360; RV64-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
361; RV64-NEXT:    .cfi_restore ra
362; RV64-NEXT:    addi sp, sp, 16
363; RV64-NEXT:    .cfi_def_cfa_offset 0
364; RV64-NEXT:    ret
365;
366; RV32-WITHFP-LABEL: branch_and_tail_call:
367; RV32-WITHFP:       # %bb.0:
368; RV32-WITHFP-NEXT:    andi a0, a0, 1
369; RV32-WITHFP-NEXT:    beqz a0, .LBB2_2
370; RV32-WITHFP-NEXT:  # %bb.1: # %blue_pill
371; RV32-WITHFP-NEXT:    tail callee1
372; RV32-WITHFP-NEXT:  .LBB2_2: # %red_pill
373; RV32-WITHFP-NEXT:    addi sp, sp, -16
374; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 16
375; RV32-WITHFP-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
376; RV32-WITHFP-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
377; RV32-WITHFP-NEXT:    .cfi_offset ra, -4
378; RV32-WITHFP-NEXT:    .cfi_offset s0, -8
379; RV32-WITHFP-NEXT:    addi s0, sp, 16
380; RV32-WITHFP-NEXT:    .cfi_def_cfa s0, 0
381; RV32-WITHFP-NEXT:    call callee2
382; RV32-WITHFP-NEXT:    .cfi_def_cfa sp, 16
383; RV32-WITHFP-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
384; RV32-WITHFP-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
385; RV32-WITHFP-NEXT:    .cfi_restore ra
386; RV32-WITHFP-NEXT:    .cfi_restore s0
387; RV32-WITHFP-NEXT:    addi sp, sp, 16
388; RV32-WITHFP-NEXT:    .cfi_def_cfa_offset 0
389; RV32-WITHFP-NEXT:    ret
390;
391; RV64-WITHFP-LABEL: branch_and_tail_call:
392; RV64-WITHFP:       # %bb.0:
393; RV64-WITHFP-NEXT:    andi a0, a0, 1
394; RV64-WITHFP-NEXT:    beqz a0, .LBB2_2
395; RV64-WITHFP-NEXT:  # %bb.1: # %blue_pill
396; RV64-WITHFP-NEXT:    tail callee1
397; RV64-WITHFP-NEXT:  .LBB2_2: # %red_pill
398; RV64-WITHFP-NEXT:    addi sp, sp, -16
399; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 16
400; RV64-WITHFP-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
401; RV64-WITHFP-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
402; RV64-WITHFP-NEXT:    .cfi_offset ra, -8
403; RV64-WITHFP-NEXT:    .cfi_offset s0, -16
404; RV64-WITHFP-NEXT:    addi s0, sp, 16
405; RV64-WITHFP-NEXT:    .cfi_def_cfa s0, 0
406; RV64-WITHFP-NEXT:    call callee2
407; RV64-WITHFP-NEXT:    .cfi_def_cfa sp, 16
408; RV64-WITHFP-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
409; RV64-WITHFP-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
410; RV64-WITHFP-NEXT:    .cfi_restore ra
411; RV64-WITHFP-NEXT:    .cfi_restore s0
412; RV64-WITHFP-NEXT:    addi sp, sp, 16
413; RV64-WITHFP-NEXT:    .cfi_def_cfa_offset 0
414; RV64-WITHFP-NEXT:    ret
415;
416; RV32-DISABLESW-LABEL: branch_and_tail_call:
417; RV32-DISABLESW:       # %bb.0:
418; RV32-DISABLESW-NEXT:    addi sp, sp, -16
419; RV32-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
420; RV32-DISABLESW-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
421; RV32-DISABLESW-NEXT:    .cfi_offset ra, -4
422; RV32-DISABLESW-NEXT:    .cfi_remember_state
423; RV32-DISABLESW-NEXT:    andi a0, a0, 1
424; RV32-DISABLESW-NEXT:    beqz a0, .LBB2_2
425; RV32-DISABLESW-NEXT:  # %bb.1: # %blue_pill
426; RV32-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
427; RV32-DISABLESW-NEXT:    .cfi_restore ra
428; RV32-DISABLESW-NEXT:    addi sp, sp, 16
429; RV32-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
430; RV32-DISABLESW-NEXT:    tail callee1
431; RV32-DISABLESW-NEXT:  .LBB2_2: # %red_pill
432; RV32-DISABLESW-NEXT:    .cfi_restore_state
433; RV32-DISABLESW-NEXT:    call callee2
434; RV32-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
435; RV32-DISABLESW-NEXT:    .cfi_restore ra
436; RV32-DISABLESW-NEXT:    addi sp, sp, 16
437; RV32-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
438; RV32-DISABLESW-NEXT:    ret
439;
440; RV64-DISABLESW-LABEL: branch_and_tail_call:
441; RV64-DISABLESW:       # %bb.0:
442; RV64-DISABLESW-NEXT:    addi sp, sp, -16
443; RV64-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
444; RV64-DISABLESW-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
445; RV64-DISABLESW-NEXT:    .cfi_offset ra, -8
446; RV64-DISABLESW-NEXT:    .cfi_remember_state
447; RV64-DISABLESW-NEXT:    andi a0, a0, 1
448; RV64-DISABLESW-NEXT:    beqz a0, .LBB2_2
449; RV64-DISABLESW-NEXT:  # %bb.1: # %blue_pill
450; RV64-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
451; RV64-DISABLESW-NEXT:    .cfi_restore ra
452; RV64-DISABLESW-NEXT:    addi sp, sp, 16
453; RV64-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
454; RV64-DISABLESW-NEXT:    tail callee1
455; RV64-DISABLESW-NEXT:  .LBB2_2: # %red_pill
456; RV64-DISABLESW-NEXT:    .cfi_restore_state
457; RV64-DISABLESW-NEXT:    call callee2
458; RV64-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
459; RV64-DISABLESW-NEXT:    .cfi_restore ra
460; RV64-DISABLESW-NEXT:    addi sp, sp, 16
461; RV64-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
462; RV64-DISABLESW-NEXT:    ret
463;
464; RV32-WITHFP-DISABLESW-LABEL: branch_and_tail_call:
465; RV32-WITHFP-DISABLESW:       # %bb.0:
466; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
467; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
468; RV32-WITHFP-DISABLESW-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
469; RV32-WITHFP-DISABLESW-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
470; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -4
471; RV32-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -8
472; RV32-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
473; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
474; RV32-WITHFP-DISABLESW-NEXT:    .cfi_remember_state
475; RV32-WITHFP-DISABLESW-NEXT:    andi a0, a0, 1
476; RV32-WITHFP-DISABLESW-NEXT:    beqz a0, .LBB2_2
477; RV32-WITHFP-DISABLESW-NEXT:  # %bb.1: # %blue_pill
478; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
479; RV32-WITHFP-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
480; RV32-WITHFP-DISABLESW-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
481; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
482; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
483; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
484; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
485; RV32-WITHFP-DISABLESW-NEXT:    tail callee1
486; RV32-WITHFP-DISABLESW-NEXT:  .LBB2_2: # %red_pill
487; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore_state
488; RV32-WITHFP-DISABLESW-NEXT:    call callee2
489; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
490; RV32-WITHFP-DISABLESW-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
491; RV32-WITHFP-DISABLESW-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
492; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
493; RV32-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
494; RV32-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
495; RV32-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
496; RV32-WITHFP-DISABLESW-NEXT:    ret
497;
498; RV64-WITHFP-DISABLESW-LABEL: branch_and_tail_call:
499; RV64-WITHFP-DISABLESW:       # %bb.0:
500; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, -16
501; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 16
502; RV64-WITHFP-DISABLESW-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
503; RV64-WITHFP-DISABLESW-NEXT:    sd s0, 0(sp) # 8-byte Folded Spill
504; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset ra, -8
505; RV64-WITHFP-DISABLESW-NEXT:    .cfi_offset s0, -16
506; RV64-WITHFP-DISABLESW-NEXT:    addi s0, sp, 16
507; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa s0, 0
508; RV64-WITHFP-DISABLESW-NEXT:    .cfi_remember_state
509; RV64-WITHFP-DISABLESW-NEXT:    andi a0, a0, 1
510; RV64-WITHFP-DISABLESW-NEXT:    beqz a0, .LBB2_2
511; RV64-WITHFP-DISABLESW-NEXT:  # %bb.1: # %blue_pill
512; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
513; RV64-WITHFP-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
514; RV64-WITHFP-DISABLESW-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
515; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
516; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
517; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
518; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
519; RV64-WITHFP-DISABLESW-NEXT:    tail callee1
520; RV64-WITHFP-DISABLESW-NEXT:  .LBB2_2: # %red_pill
521; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore_state
522; RV64-WITHFP-DISABLESW-NEXT:    call callee2
523; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa sp, 16
524; RV64-WITHFP-DISABLESW-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
525; RV64-WITHFP-DISABLESW-NEXT:    ld s0, 0(sp) # 8-byte Folded Reload
526; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore ra
527; RV64-WITHFP-DISABLESW-NEXT:    .cfi_restore s0
528; RV64-WITHFP-DISABLESW-NEXT:    addi sp, sp, 16
529; RV64-WITHFP-DISABLESW-NEXT:    .cfi_def_cfa_offset 0
530; RV64-WITHFP-DISABLESW-NEXT:    ret
531  br i1 %a, label %blue_pill, label %red_pill
532blue_pill:
533  tail call void @callee1()
534  ret void
535red_pill:
536  call void @callee2()
537  ret void
538}
539
540declare void @callee1()
541declare void @callee2()
542declare void @callee_with_args(ptr)
543