xref: /llvm-project/llvm/test/CodeGen/Mips/analyzebranch.ll (revision a2b901129099b93f20e8cdf41f520e31398c0c4d)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32   < %s | FileCheck %s -check-prefixes=MIPS32
3; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=MIPS32R2
4; RUN: llc -mtriple=mips-unknown-linux-gnu -mcpu=mips32r6 < %s | FileCheck %s -check-prefixes=MIPS32r6
5; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips4    < %s | FileCheck %s -check-prefixes=MIPS4
6; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64   < %s | FileCheck %s -check-prefixes=MIPS64
7; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r2 < %s | FileCheck %s -check-prefixes=MIPS64R2
8; RUN: llc -mtriple=mips64-unknown-linux-gnu -mcpu=mips64r6 < %s | FileCheck %s -check-prefixes=MIPS64R6
9
10define double @foo(double %a, double %b) nounwind readnone {
11; MIPS32-LABEL: foo:
12; MIPS32:       # %bb.0: # %entry
13; MIPS32-NEXT:    mtc1 $zero, $f2
14; MIPS32-NEXT:    mtc1 $zero, $f3
15; MIPS32-NEXT:    c.ule.d $f12, $f2
16; MIPS32-NEXT:    bc1f $BB0_2
17; MIPS32-NEXT:    mov.d $f0, $f12
18; MIPS32-NEXT:  # %bb.1: # %if.else
19; MIPS32-NEXT:    mtc1 $zero, $f0
20; MIPS32-NEXT:    mtc1 $zero, $f1
21; MIPS32-NEXT:    c.ule.d $f14, $f0
22; MIPS32-NEXT:    bc1t $BB0_3
23; MIPS32-NEXT:    nop
24; MIPS32-NEXT:  $BB0_2: # %if.end6
25; MIPS32-NEXT:    sub.d $f0, $f14, $f0
26; MIPS32-NEXT:    add.d $f0, $f0, $f0
27; MIPS32-NEXT:  $BB0_3: # %return
28; MIPS32-NEXT:    jr $ra
29; MIPS32-NEXT:    nop
30;
31; MIPS32R2-LABEL: foo:
32; MIPS32R2:       # %bb.0: # %entry
33; MIPS32R2-NEXT:    mov.d $f0, $f12
34; MIPS32R2-NEXT:    mtc1 $zero, $f2
35; MIPS32R2-NEXT:    mthc1 $zero, $f2
36; MIPS32R2-NEXT:    c.ule.d $f12, $f2
37; MIPS32R2-NEXT:    bc1f $BB0_2
38; MIPS32R2-NEXT:    nop
39; MIPS32R2-NEXT:  # %bb.1: # %if.else
40; MIPS32R2-NEXT:    mtc1 $zero, $f0
41; MIPS32R2-NEXT:    mthc1 $zero, $f0
42; MIPS32R2-NEXT:    c.ule.d $f14, $f0
43; MIPS32R2-NEXT:    bc1t $BB0_3
44; MIPS32R2-NEXT:    nop
45; MIPS32R2-NEXT:  $BB0_2: # %if.end6
46; MIPS32R2-NEXT:    sub.d $f0, $f14, $f0
47; MIPS32R2-NEXT:    add.d $f0, $f0, $f0
48; MIPS32R2-NEXT:  $BB0_3: # %return
49; MIPS32R2-NEXT:    jr $ra
50; MIPS32R2-NEXT:    nop
51;
52; MIPS32r6-LABEL: foo:
53; MIPS32r6:       # %bb.0: # %entry
54; MIPS32r6-NEXT:    mov.d $f0, $f12
55; MIPS32r6-NEXT:    mtc1 $zero, $f1
56; MIPS32r6-NEXT:    mthc1 $zero, $f1
57; MIPS32r6-NEXT:    cmp.lt.d $f1, $f1, $f12
58; MIPS32r6-NEXT:    mfc1 $1, $f1
59; MIPS32r6-NEXT:    andi $1, $1, 1
60; MIPS32r6-NEXT:    bnezc $1, $BB0_2
61; MIPS32r6-NEXT:  # %bb.1: # %if.else
62; MIPS32r6-NEXT:    mtc1 $zero, $f0
63; MIPS32r6-NEXT:    mthc1 $zero, $f0
64; MIPS32r6-NEXT:    cmp.ule.d $f1, $f14, $f0
65; MIPS32r6-NEXT:    mfc1 $1, $f1
66; MIPS32r6-NEXT:    andi $1, $1, 1
67; MIPS32r6-NEXT:    bnezc $1, $BB0_3
68; MIPS32r6-NEXT:  $BB0_2: # %if.end6
69; MIPS32r6-NEXT:    sub.d $f0, $f14, $f0
70; MIPS32r6-NEXT:    add.d $f0, $f0, $f0
71; MIPS32r6-NEXT:  $BB0_3: # %return
72; MIPS32r6-NEXT:    jrc $ra
73;
74; MIPS4-LABEL: foo:
75; MIPS4:       # %bb.0: # %entry
76; MIPS4-NEXT:    dmtc1 $zero, $f1
77; MIPS4-NEXT:    c.ule.d $f12, $f1
78; MIPS4-NEXT:    bc1f .LBB0_2
79; MIPS4-NEXT:    mov.d $f0, $f12
80; MIPS4-NEXT:  # %bb.1: # %if.else
81; MIPS4-NEXT:    dmtc1 $zero, $f0
82; MIPS4-NEXT:    c.ule.d $f13, $f0
83; MIPS4-NEXT:    bc1t .LBB0_3
84; MIPS4-NEXT:    nop
85; MIPS4-NEXT:  .LBB0_2: # %if.end6
86; MIPS4-NEXT:    sub.d $f0, $f13, $f0
87; MIPS4-NEXT:    add.d $f0, $f0, $f0
88; MIPS4-NEXT:  .LBB0_3: # %return
89; MIPS4-NEXT:    jr $ra
90; MIPS4-NEXT:    nop
91;
92; MIPS64-LABEL: foo:
93; MIPS64:       # %bb.0: # %entry
94; MIPS64-NEXT:    dmtc1 $zero, $f1
95; MIPS64-NEXT:    c.ule.d $f12, $f1
96; MIPS64-NEXT:    bc1f .LBB0_2
97; MIPS64-NEXT:    mov.d $f0, $f12
98; MIPS64-NEXT:  # %bb.1: # %if.else
99; MIPS64-NEXT:    dmtc1 $zero, $f0
100; MIPS64-NEXT:    c.ule.d $f13, $f0
101; MIPS64-NEXT:    bc1t .LBB0_3
102; MIPS64-NEXT:    nop
103; MIPS64-NEXT:  .LBB0_2: # %if.end6
104; MIPS64-NEXT:    sub.d $f0, $f13, $f0
105; MIPS64-NEXT:    add.d $f0, $f0, $f0
106; MIPS64-NEXT:  .LBB0_3: # %return
107; MIPS64-NEXT:    jr $ra
108; MIPS64-NEXT:    nop
109;
110; MIPS64R2-LABEL: foo:
111; MIPS64R2:       # %bb.0: # %entry
112; MIPS64R2-NEXT:    dmtc1 $zero, $f1
113; MIPS64R2-NEXT:    c.ule.d $f12, $f1
114; MIPS64R2-NEXT:    bc1f .LBB0_2
115; MIPS64R2-NEXT:    mov.d $f0, $f12
116; MIPS64R2-NEXT:  # %bb.1: # %if.else
117; MIPS64R2-NEXT:    dmtc1 $zero, $f0
118; MIPS64R2-NEXT:    c.ule.d $f13, $f0
119; MIPS64R2-NEXT:    bc1t .LBB0_3
120; MIPS64R2-NEXT:    nop
121; MIPS64R2-NEXT:  .LBB0_2: # %if.end6
122; MIPS64R2-NEXT:    sub.d $f0, $f13, $f0
123; MIPS64R2-NEXT:    add.d $f0, $f0, $f0
124; MIPS64R2-NEXT:  .LBB0_3: # %return
125; MIPS64R2-NEXT:    jr $ra
126; MIPS64R2-NEXT:    nop
127;
128; MIPS64R6-LABEL: foo:
129; MIPS64R6:       # %bb.0: # %entry
130; MIPS64R6-NEXT:    dmtc1 $zero, $f1
131; MIPS64R6-NEXT:    cmp.lt.d $f1, $f1, $f12
132; MIPS64R6-NEXT:    mfc1 $1, $f1
133; MIPS64R6-NEXT:    andi $1, $1, 1
134; MIPS64R6-NEXT:    bnez $1, .LBB0_2
135; MIPS64R6-NEXT:    mov.d	$f0, $f12
136; MIPS64R6-NEXT:  # %bb.1: # %if.else
137; MIPS64R6-NEXT:    dmtc1 $zero, $f0
138; MIPS64R6-NEXT:    cmp.ule.d $f1, $f13, $f0
139; MIPS64R6-NEXT:    mfc1 $1, $f1
140; MIPS64R6-NEXT:    andi $1, $1, 1
141; MIPS64R6-NEXT:    bnezc $1, .LBB0_3
142; MIPS64R6-NEXT:  .LBB0_2: # %if.end6
143; MIPS64R6-NEXT:    sub.d $f0, $f13, $f0
144; MIPS64R6-NEXT:    add.d $f0, $f0, $f0
145; MIPS64R6-NEXT:  .LBB0_3: # %return
146; MIPS64R6-NEXT:    jrc $ra
147entry:
148  %cmp = fcmp ogt double %a, 0.000000e+00
149  br i1 %cmp, label %if.end6, label %if.else
150
151if.else:                                          ; preds = %entry
152  %cmp3 = fcmp ogt double %b, 0.000000e+00
153  br i1 %cmp3, label %if.end6, label %return
154
155if.end6:                                          ; preds = %if.else, %entry
156  %c.0 = phi double [ %a, %entry ], [ 0.000000e+00, %if.else ]
157  %sub = fsub double %b, %c.0
158  %mul = fmul double %sub, 2.000000e+00
159  br label %return
160
161return:                                           ; preds = %if.else, %if.end6
162  %retval.0 = phi double [ %mul, %if.end6 ], [ 0.000000e+00, %if.else ]
163  ret double %retval.0
164}
165
166define void @f1(float %f) nounwind {
167; MIPS32-LABEL: f1:
168; MIPS32:       # %bb.0: # %entry
169; MIPS32-NEXT:    addiu $sp, $sp, -24
170; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
171; MIPS32-NEXT:    mtc1 $zero, $f0
172; MIPS32-NEXT:    c.eq.s $f12, $f0
173; MIPS32-NEXT:    bc1f $BB1_2
174; MIPS32-NEXT:    nop
175; MIPS32-NEXT:  # %bb.1: # %if.end
176; MIPS32-NEXT:    jal f2
177; MIPS32-NEXT:    nop
178; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
179; MIPS32-NEXT:    jr $ra
180; MIPS32-NEXT:    addiu $sp, $sp, 24
181; MIPS32-NEXT:  $BB1_2: # %if.then
182; MIPS32-NEXT:    jal abort
183; MIPS32-NEXT:    nop
184;
185; MIPS32R2-LABEL: f1:
186; MIPS32R2:       # %bb.0: # %entry
187; MIPS32R2-NEXT:    addiu $sp, $sp, -24
188; MIPS32R2-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
189; MIPS32R2-NEXT:    mtc1 $zero, $f0
190; MIPS32R2-NEXT:    c.eq.s $f12, $f0
191; MIPS32R2-NEXT:    bc1f $BB1_2
192; MIPS32R2-NEXT:    nop
193; MIPS32R2-NEXT:  # %bb.1: # %if.end
194; MIPS32R2-NEXT:    jal f2
195; MIPS32R2-NEXT:    nop
196; MIPS32R2-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
197; MIPS32R2-NEXT:    jr $ra
198; MIPS32R2-NEXT:    addiu $sp, $sp, 24
199; MIPS32R2-NEXT:  $BB1_2: # %if.then
200; MIPS32R2-NEXT:    jal abort
201; MIPS32R2-NEXT:    nop
202;
203; MIPS32r6-LABEL: f1:
204; MIPS32r6:       # %bb.0: # %entry
205; MIPS32r6-NEXT:    addiu $sp, $sp, -24
206; MIPS32r6-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
207; MIPS32r6-NEXT:    mtc1 $zero, $f0
208; MIPS32r6-NEXT:    cmp.eq.s $f0, $f12, $f0
209; MIPS32r6-NEXT:    mfc1 $1, $f0
210; MIPS32r6-NEXT:    andi $1, $1, 1
211; MIPS32r6-NEXT:    beqzc $1, $BB1_2
212; MIPS32r6-NEXT:    nop
213; MIPS32r6-NEXT:  # %bb.1: # %if.end
214; MIPS32r6-NEXT:    jal f2
215; MIPS32r6-NEXT:    nop
216; MIPS32r6-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
217; MIPS32r6-NEXT:    jr $ra
218; MIPS32r6-NEXT:    addiu $sp, $sp, 24
219; MIPS32r6-NEXT:  $BB1_2: # %if.then
220; MIPS32r6-NEXT:    jal abort
221; MIPS32r6-NEXT:    nop
222;
223; MIPS4-LABEL: f1:
224; MIPS4:       # %bb.0: # %entry
225; MIPS4-NEXT:    daddiu $sp, $sp, -16
226; MIPS4-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
227; MIPS4-NEXT:    mtc1 $zero, $f0
228; MIPS4-NEXT:    c.eq.s $f12, $f0
229; MIPS4-NEXT:    bc1f .LBB1_2
230; MIPS4-NEXT:    nop
231; MIPS4-NEXT:  # %bb.1: # %if.end
232; MIPS4-NEXT:    jal f2
233; MIPS4-NEXT:    nop
234; MIPS4-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
235; MIPS4-NEXT:    jr $ra
236; MIPS4-NEXT:    daddiu $sp, $sp, 16
237; MIPS4-NEXT:  .LBB1_2: # %if.then
238; MIPS4-NEXT:    jal abort
239; MIPS4-NEXT:    nop
240;
241; MIPS64-LABEL: f1:
242; MIPS64:       # %bb.0: # %entry
243; MIPS64-NEXT:    daddiu $sp, $sp, -16
244; MIPS64-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
245; MIPS64-NEXT:    mtc1 $zero, $f0
246; MIPS64-NEXT:    c.eq.s $f12, $f0
247; MIPS64-NEXT:    bc1f .LBB1_2
248; MIPS64-NEXT:    nop
249; MIPS64-NEXT:  # %bb.1: # %if.end
250; MIPS64-NEXT:    jal f2
251; MIPS64-NEXT:    nop
252; MIPS64-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
253; MIPS64-NEXT:    jr $ra
254; MIPS64-NEXT:    daddiu $sp, $sp, 16
255; MIPS64-NEXT:  .LBB1_2: # %if.then
256; MIPS64-NEXT:    jal abort
257; MIPS64-NEXT:    nop
258;
259; MIPS64R2-LABEL: f1:
260; MIPS64R2:       # %bb.0: # %entry
261; MIPS64R2-NEXT:    daddiu $sp, $sp, -16
262; MIPS64R2-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
263; MIPS64R2-NEXT:    mtc1 $zero, $f0
264; MIPS64R2-NEXT:    c.eq.s $f12, $f0
265; MIPS64R2-NEXT:    bc1f .LBB1_2
266; MIPS64R2-NEXT:    nop
267; MIPS64R2-NEXT:  # %bb.1: # %if.end
268; MIPS64R2-NEXT:    jal f2
269; MIPS64R2-NEXT:    nop
270; MIPS64R2-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
271; MIPS64R2-NEXT:    jr $ra
272; MIPS64R2-NEXT:    daddiu $sp, $sp, 16
273; MIPS64R2-NEXT:  .LBB1_2: # %if.then
274; MIPS64R2-NEXT:    jal abort
275; MIPS64R2-NEXT:    nop
276;
277; MIPS64R6-LABEL: f1:
278; MIPS64R6:       # %bb.0: # %entry
279; MIPS64R6-NEXT:    daddiu $sp, $sp, -16
280; MIPS64R6-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
281; MIPS64R6-NEXT:    mtc1 $zero, $f0
282; MIPS64R6-NEXT:    cmp.eq.s $f0, $f12, $f0
283; MIPS64R6-NEXT:    mfc1 $1, $f0
284; MIPS64R6-NEXT:    andi $1, $1, 1
285; MIPS64R6-NEXT:    beqzc $1, .LBB1_2
286; MIPS64R6-NEXT:    nop
287; MIPS64R6-NEXT:  # %bb.1: # %if.end
288; MIPS64R6-NEXT:    jal f2
289; MIPS64R6-NEXT:    nop
290; MIPS64R6-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
291; MIPS64R6-NEXT:    jr $ra
292; MIPS64R6-NEXT:    daddiu $sp, $sp, 16
293; MIPS64R6-NEXT:  .LBB1_2: # %if.then
294; MIPS64R6-NEXT:    jal abort
295; MIPS64R6-NEXT:    nop
296entry:
297  %cmp = fcmp une float %f, 0.000000e+00
298  br i1 %cmp, label %if.then, label %if.end
299
300if.then:                                          ; preds = %entry
301  tail call void @abort() noreturn
302  unreachable
303
304if.end:                                           ; preds = %entry
305  tail call void (...) @f2() nounwind
306  ret void
307}
308
309declare void @abort() noreturn nounwind
310
311declare void @f2(...)
312