xref: /llvm-project/llvm/test/CodeGen/Mips/GlobalISel/llvm-ir/phi.ll (revision 8663926a544602932d299dda435ed1ef70a05f48)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc  -O0 -mtriple=mipsel-linux-gnu -global-isel  -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32
3
4define i1 @phi_i1(i1 %cnd, i1 %a, i1 %b) {
5; MIPS32-LABEL: phi_i1:
6; MIPS32:       # %bb.0: # %entry
7; MIPS32-NEXT:    addiu $sp, $sp, -16
8; MIPS32-NEXT:    .cfi_def_cfa_offset 16
9; MIPS32-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
10; MIPS32-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
11; MIPS32-NEXT:    andi $1, $4, 1
12; MIPS32-NEXT:    bnez $1, $BB0_2
13; MIPS32-NEXT:    nop
14; MIPS32-NEXT:  # %bb.1: # %entry
15; MIPS32-NEXT:    j $BB0_3
16; MIPS32-NEXT:    nop
17; MIPS32-NEXT:  $BB0_2: # %cond.true
18; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
19; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
20; MIPS32-NEXT:    j $BB0_4
21; MIPS32-NEXT:    nop
22; MIPS32-NEXT:  $BB0_3: # %cond.false
23; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
24; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
25; MIPS32-NEXT:    j $BB0_4
26; MIPS32-NEXT:    nop
27; MIPS32-NEXT:  $BB0_4: # %cond.end
28; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
29; MIPS32-NEXT:    addiu $sp, $sp, 16
30; MIPS32-NEXT:    jr $ra
31; MIPS32-NEXT:    nop
32entry:
33  br i1 %cnd, label %cond.true, label %cond.false
34
35cond.true:
36  br label %cond.end
37
38cond.false:
39  br label %cond.end
40
41cond.end:
42  %cond = phi i1 [ %a, %cond.true ], [ %b, %cond.false ]
43  ret i1 %cond
44}
45
46define i8 @phi_i8(i1 %cnd, i8 %a, i8 %b) {
47; MIPS32-LABEL: phi_i8:
48; MIPS32:       # %bb.0: # %entry
49; MIPS32-NEXT:    addiu $sp, $sp, -16
50; MIPS32-NEXT:    .cfi_def_cfa_offset 16
51; MIPS32-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
52; MIPS32-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
53; MIPS32-NEXT:    andi $1, $4, 1
54; MIPS32-NEXT:    bnez $1, $BB1_2
55; MIPS32-NEXT:    nop
56; MIPS32-NEXT:  # %bb.1: # %entry
57; MIPS32-NEXT:    j $BB1_3
58; MIPS32-NEXT:    nop
59; MIPS32-NEXT:  $BB1_2: # %cond.true
60; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
61; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
62; MIPS32-NEXT:    j $BB1_4
63; MIPS32-NEXT:    nop
64; MIPS32-NEXT:  $BB1_3: # %cond.false
65; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
66; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
67; MIPS32-NEXT:    j $BB1_4
68; MIPS32-NEXT:    nop
69; MIPS32-NEXT:  $BB1_4: # %cond.end
70; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
71; MIPS32-NEXT:    addiu $sp, $sp, 16
72; MIPS32-NEXT:    jr $ra
73; MIPS32-NEXT:    nop
74entry:
75  br i1 %cnd, label %cond.true, label %cond.false
76
77cond.true:
78  br label %cond.end
79
80cond.false:
81  br label %cond.end
82
83cond.end:
84  %cond = phi i8 [ %a, %cond.true ], [ %b, %cond.false ]
85  ret i8 %cond
86}
87
88define i16 @phi_i16(i1 %cnd, i16 %a, i16 %b) {
89; MIPS32-LABEL: phi_i16:
90; MIPS32:       # %bb.0: # %entry
91; MIPS32-NEXT:    addiu $sp, $sp, -16
92; MIPS32-NEXT:    .cfi_def_cfa_offset 16
93; MIPS32-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
94; MIPS32-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
95; MIPS32-NEXT:    andi $1, $4, 1
96; MIPS32-NEXT:    bnez $1, $BB2_2
97; MIPS32-NEXT:    nop
98; MIPS32-NEXT:  # %bb.1: # %entry
99; MIPS32-NEXT:    j $BB2_3
100; MIPS32-NEXT:    nop
101; MIPS32-NEXT:  $BB2_2: # %cond.true
102; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
103; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
104; MIPS32-NEXT:    j $BB2_4
105; MIPS32-NEXT:    nop
106; MIPS32-NEXT:  $BB2_3: # %cond.false
107; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
108; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
109; MIPS32-NEXT:    j $BB2_4
110; MIPS32-NEXT:    nop
111; MIPS32-NEXT:  $BB2_4: # %cond.end
112; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
113; MIPS32-NEXT:    addiu $sp, $sp, 16
114; MIPS32-NEXT:    jr $ra
115; MIPS32-NEXT:    nop
116entry:
117  br i1 %cnd, label %cond.true, label %cond.false
118
119cond.true:
120  br label %cond.end
121
122cond.false:
123  br label %cond.end
124
125cond.end:
126  %cond = phi i16 [ %a, %cond.true ], [ %b, %cond.false ]
127  ret i16 %cond
128}
129
130define i32 @phi_i32(i1 %cnd, i32 %a, i32 %b) {
131; MIPS32-LABEL: phi_i32:
132; MIPS32:       # %bb.0: # %entry
133; MIPS32-NEXT:    addiu $sp, $sp, -16
134; MIPS32-NEXT:    .cfi_def_cfa_offset 16
135; MIPS32-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
136; MIPS32-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
137; MIPS32-NEXT:    andi $1, $4, 1
138; MIPS32-NEXT:    bnez $1, $BB3_2
139; MIPS32-NEXT:    nop
140; MIPS32-NEXT:  # %bb.1: # %entry
141; MIPS32-NEXT:    j $BB3_3
142; MIPS32-NEXT:    nop
143; MIPS32-NEXT:  $BB3_2: # %cond.true
144; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
145; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
146; MIPS32-NEXT:    j $BB3_4
147; MIPS32-NEXT:    nop
148; MIPS32-NEXT:  $BB3_3: # %cond.false
149; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
150; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
151; MIPS32-NEXT:    j $BB3_4
152; MIPS32-NEXT:    nop
153; MIPS32-NEXT:  $BB3_4: # %cond.end
154; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
155; MIPS32-NEXT:    addiu $sp, $sp, 16
156; MIPS32-NEXT:    jr $ra
157; MIPS32-NEXT:    nop
158entry:
159  br i1 %cnd, label %cond.true, label %cond.false
160
161cond.true:
162  br label %cond.end
163
164cond.false:
165  br label %cond.end
166
167cond.end:
168  %cond = phi i32 [ %a, %cond.true ], [ %b, %cond.false ]
169  ret i32 %cond
170}
171
172define i64 @phi_i64(i1 %cnd, i64 %a, i64 %b) {
173; MIPS32-LABEL: phi_i64:
174; MIPS32:       # %bb.0: # %entry
175; MIPS32-NEXT:    addiu $sp, $sp, -24
176; MIPS32-NEXT:    .cfi_def_cfa_offset 24
177; MIPS32-NEXT:    sw $6, 8($sp) # 4-byte Folded Spill
178; MIPS32-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
179; MIPS32-NEXT:    addiu $1, $sp, 40
180; MIPS32-NEXT:    lw $1, 0($1)
181; MIPS32-NEXT:    sw $1, 16($sp) # 4-byte Folded Spill
182; MIPS32-NEXT:    addiu $1, $sp, 44
183; MIPS32-NEXT:    lw $1, 0($1)
184; MIPS32-NEXT:    sw $1, 20($sp) # 4-byte Folded Spill
185; MIPS32-NEXT:    andi $1, $4, 1
186; MIPS32-NEXT:    bnez $1, $BB4_2
187; MIPS32-NEXT:    nop
188; MIPS32-NEXT:  # %bb.1: # %entry
189; MIPS32-NEXT:    j $BB4_3
190; MIPS32-NEXT:    nop
191; MIPS32-NEXT:  $BB4_2: # %cond.true
192; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
193; MIPS32-NEXT:    lw $2, 8($sp) # 4-byte Folded Reload
194; MIPS32-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
195; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
196; MIPS32-NEXT:    j $BB4_4
197; MIPS32-NEXT:    nop
198; MIPS32-NEXT:  $BB4_3: # %cond.false
199; MIPS32-NEXT:    lw $1, 20($sp) # 4-byte Folded Reload
200; MIPS32-NEXT:    lw $2, 16($sp) # 4-byte Folded Reload
201; MIPS32-NEXT:    sw $2, 0($sp) # 4-byte Folded Spill
202; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
203; MIPS32-NEXT:    j $BB4_4
204; MIPS32-NEXT:    nop
205; MIPS32-NEXT:  $BB4_4: # %cond.end
206; MIPS32-NEXT:    lw $2, 0($sp) # 4-byte Folded Reload
207; MIPS32-NEXT:    lw $3, 4($sp) # 4-byte Folded Reload
208; MIPS32-NEXT:    addiu $sp, $sp, 24
209; MIPS32-NEXT:    jr $ra
210; MIPS32-NEXT:    nop
211entry:
212  br i1 %cnd, label %cond.true, label %cond.false
213
214cond.true:
215  br label %cond.end
216
217cond.false:
218  br label %cond.end
219
220cond.end:
221  %cond = phi i64 [ %a, %cond.true ], [ %b, %cond.false ]
222  ret i64 %cond
223}
224
225define void @phi_ambiguous_i64_in_fpr(i1 %cnd, ptr %i64_ptr_a, ptr %i64_ptr_b, ptr %i64_ptr_c) {
226; MIPS32-LABEL: phi_ambiguous_i64_in_fpr:
227; MIPS32:       # %bb.0: # %entry
228; MIPS32-NEXT:    addiu $sp, $sp, -32
229; MIPS32-NEXT:    .cfi_def_cfa_offset 32
230; MIPS32-NEXT:    sw $7, 12($sp) # 4-byte Folded Spill
231; MIPS32-NEXT:    ldc1 $f0, 0($5)
232; MIPS32-NEXT:    sdc1 $f0, 16($sp) # 8-byte Folded Spill
233; MIPS32-NEXT:    ldc1 $f0, 0($6)
234; MIPS32-NEXT:    sdc1 $f0, 24($sp) # 8-byte Folded Spill
235; MIPS32-NEXT:    andi $1, $4, 1
236; MIPS32-NEXT:    bnez $1, $BB5_2
237; MIPS32-NEXT:    nop
238; MIPS32-NEXT:  # %bb.1: # %entry
239; MIPS32-NEXT:    j $BB5_3
240; MIPS32-NEXT:    nop
241; MIPS32-NEXT:  $BB5_2: # %cond.true
242; MIPS32-NEXT:    ldc1 $f0, 16($sp) # 8-byte Folded Reload
243; MIPS32-NEXT:    sdc1 $f0, 0($sp) # 8-byte Folded Spill
244; MIPS32-NEXT:    j $BB5_4
245; MIPS32-NEXT:    nop
246; MIPS32-NEXT:  $BB5_3: # %cond.false
247; MIPS32-NEXT:    ldc1 $f0, 24($sp) # 8-byte Folded Reload
248; MIPS32-NEXT:    sdc1 $f0, 0($sp) # 8-byte Folded Spill
249; MIPS32-NEXT:    j $BB5_4
250; MIPS32-NEXT:    nop
251; MIPS32-NEXT:  $BB5_4: # %cond.end
252; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
253; MIPS32-NEXT:    ldc1 $f0, 0($sp) # 8-byte Folded Reload
254; MIPS32-NEXT:    sdc1 $f0, 0($1)
255; MIPS32-NEXT:    addiu $sp, $sp, 32
256; MIPS32-NEXT:    jr $ra
257; MIPS32-NEXT:    nop
258entry:
259  %0 = load i64, ptr %i64_ptr_a, align 8
260  %1 = load i64, ptr %i64_ptr_b, align 8
261  br i1 %cnd, label %cond.true, label %cond.false
262
263cond.true:
264  br label %cond.end
265
266cond.false:
267  br label %cond.end
268
269cond.end:
270  %cond = phi i64 [ %0, %cond.true ], [ %1, %cond.false ]
271  store i64 %cond, ptr %i64_ptr_c, align 8
272  ret void
273}
274
275define float @phi_float(i1 %cnd, float %a, float %b) {
276; MIPS32-LABEL: phi_float:
277; MIPS32:       # %bb.0: # %entry
278; MIPS32-NEXT:    addiu $sp, $sp, -16
279; MIPS32-NEXT:    .cfi_def_cfa_offset 16
280; MIPS32-NEXT:    sw $5, 8($sp) # 4-byte Folded Spill
281; MIPS32-NEXT:    sw $6, 12($sp) # 4-byte Folded Spill
282; MIPS32-NEXT:    andi $1, $4, 1
283; MIPS32-NEXT:    bnez $1, $BB6_2
284; MIPS32-NEXT:    nop
285; MIPS32-NEXT:  # %bb.1: # %entry
286; MIPS32-NEXT:    j $BB6_3
287; MIPS32-NEXT:    nop
288; MIPS32-NEXT:  $BB6_2: # %cond.true
289; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
290; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
291; MIPS32-NEXT:    j $BB6_4
292; MIPS32-NEXT:    nop
293; MIPS32-NEXT:  $BB6_3: # %cond.false
294; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
295; MIPS32-NEXT:    sw $1, 4($sp) # 4-byte Folded Spill
296; MIPS32-NEXT:    j $BB6_4
297; MIPS32-NEXT:    nop
298; MIPS32-NEXT:  $BB6_4: # %cond.end
299; MIPS32-NEXT:    lw $1, 4($sp) # 4-byte Folded Reload
300; MIPS32-NEXT:    mtc1 $1, $f0
301; MIPS32-NEXT:    addiu $sp, $sp, 16
302; MIPS32-NEXT:    jr $ra
303; MIPS32-NEXT:    nop
304entry:
305  br i1 %cnd, label %cond.true, label %cond.false
306
307cond.true:
308  br label %cond.end
309
310cond.false:
311  br label %cond.end
312
313cond.end:
314  %cond = phi float [ %a, %cond.true ], [ %b, %cond.false ]
315  ret float %cond
316}
317
318define void @phi_ambiguous_float_in_gpr(i1 %cnd, ptr %f32_ptr_a, ptr %f32_ptr_b, ptr %f32_ptr_c) {
319; MIPS32-LABEL: phi_ambiguous_float_in_gpr:
320; MIPS32:       # %bb.0: # %entry
321; MIPS32-NEXT:    addiu $sp, $sp, -16
322; MIPS32-NEXT:    .cfi_def_cfa_offset 16
323; MIPS32-NEXT:    sw $7, 4($sp) # 4-byte Folded Spill
324; MIPS32-NEXT:    lw $1, 0($5)
325; MIPS32-NEXT:    sw $1, 8($sp) # 4-byte Folded Spill
326; MIPS32-NEXT:    lw $1, 0($6)
327; MIPS32-NEXT:    sw $1, 12($sp) # 4-byte Folded Spill
328; MIPS32-NEXT:    andi $1, $4, 1
329; MIPS32-NEXT:    bnez $1, $BB7_2
330; MIPS32-NEXT:    nop
331; MIPS32-NEXT:  # %bb.1: # %entry
332; MIPS32-NEXT:    j $BB7_3
333; MIPS32-NEXT:    nop
334; MIPS32-NEXT:  $BB7_2: # %cond.true
335; MIPS32-NEXT:    lw $1, 8($sp) # 4-byte Folded Reload
336; MIPS32-NEXT:    sw $1, 0($sp) # 4-byte Folded Spill
337; MIPS32-NEXT:    j $BB7_4
338; MIPS32-NEXT:    nop
339; MIPS32-NEXT:  $BB7_3: # %cond.false
340; MIPS32-NEXT:    lw $1, 12($sp) # 4-byte Folded Reload
341; MIPS32-NEXT:    sw $1, 0($sp) # 4-byte Folded Spill
342; MIPS32-NEXT:    j $BB7_4
343; MIPS32-NEXT:    nop
344; MIPS32-NEXT:  $BB7_4: # %cond.end
345; MIPS32-NEXT:    lw $2, 4($sp) # 4-byte Folded Reload
346; MIPS32-NEXT:    lw $1, 0($sp) # 4-byte Folded Reload
347; MIPS32-NEXT:    sw $1, 0($2)
348; MIPS32-NEXT:    addiu $sp, $sp, 16
349; MIPS32-NEXT:    jr $ra
350; MIPS32-NEXT:    nop
351entry:
352  %0 = load float, ptr %f32_ptr_a, align 4
353  %1 = load float, ptr %f32_ptr_b, align 4
354  br i1 %cnd, label %cond.true, label %cond.false
355
356cond.true:
357  br label %cond.end
358
359cond.false:
360  br label %cond.end
361
362cond.end:
363  %cond = phi float [ %0, %cond.true ], [ %1, %cond.false ]
364  store float %cond, ptr %f32_ptr_c, align 4
365  ret void
366}
367
368define double @phi_double(double %a, double %b, i1 %cnd) {
369; MIPS32-LABEL: phi_double:
370; MIPS32:       # %bb.0: # %entry
371; MIPS32-NEXT:    addiu $sp, $sp, -24
372; MIPS32-NEXT:    .cfi_def_cfa_offset 24
373; MIPS32-NEXT:    sdc1 $f12, 8($sp) # 8-byte Folded Spill
374; MIPS32-NEXT:    sdc1 $f14, 16($sp) # 8-byte Folded Spill
375; MIPS32-NEXT:    addiu $1, $sp, 40
376; MIPS32-NEXT:    lw $1, 0($1)
377; MIPS32-NEXT:    andi $1, $1, 1
378; MIPS32-NEXT:    bnez $1, $BB8_2
379; MIPS32-NEXT:    nop
380; MIPS32-NEXT:  # %bb.1: # %entry
381; MIPS32-NEXT:    j $BB8_3
382; MIPS32-NEXT:    nop
383; MIPS32-NEXT:  $BB8_2: # %cond.true
384; MIPS32-NEXT:    ldc1 $f0, 8($sp) # 8-byte Folded Reload
385; MIPS32-NEXT:    sdc1 $f0, 0($sp) # 8-byte Folded Spill
386; MIPS32-NEXT:    j $BB8_4
387; MIPS32-NEXT:    nop
388; MIPS32-NEXT:  $BB8_3: # %cond.false
389; MIPS32-NEXT:    ldc1 $f0, 16($sp) # 8-byte Folded Reload
390; MIPS32-NEXT:    sdc1 $f0, 0($sp) # 8-byte Folded Spill
391; MIPS32-NEXT:    j $BB8_4
392; MIPS32-NEXT:    nop
393; MIPS32-NEXT:  $BB8_4: # %cond.end
394; MIPS32-NEXT:    ldc1 $f0, 0($sp) # 8-byte Folded Reload
395; MIPS32-NEXT:    addiu $sp, $sp, 24
396; MIPS32-NEXT:    jr $ra
397; MIPS32-NEXT:    nop
398entry:
399  br i1 %cnd, label %cond.true, label %cond.false
400
401cond.true:
402  br label %cond.end
403
404cond.false:
405  br label %cond.end
406
407cond.end:
408  %cond = phi double [ %a, %cond.true ], [ %b, %cond.false ]
409  ret double %cond
410}
411