Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Mips / llvm-ir / nan-fp-attr.ll
blob918cda6b38c2659ee4a25bde220e077c80fedc99
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -march=mips -mcpu=mips32 | FileCheck %s --check-prefix=MIPS32R1
3 ; RUN: llc < %s -march=mips -mcpu=mips32r2 | FileCheck %s --check-prefix=MIPS32R2
4 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS32R2-ABS2K8
5 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+abs2008,+fp64 | FileCheck %s --check-prefix=MIPS32R2-ABS2K8
6 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+fp64 | FileCheck %s --check-prefix=MIPS32R2
7 ; RUN: llc < %s -march=mips -mcpu=mips32r6 | FileCheck %s --check-prefix=MIPS32R6
8 ; RUN: llc < %s -march=mips64 -mcpu=mips64 | FileCheck %s --check-prefix=MIPS64R1
9 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | FileCheck %s --check-prefix=MIPS64R2
10 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS64R2-ABS2K8
11 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | FileCheck %s --check-prefix=MIPS64R6
12 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 -mattr=+abs2008 | FileCheck %s --check-prefix=MIPS64R6-ABS2K8
13 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+micromips | FileCheck %s --check-prefix=MM
14 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+micromips,+abs2008 | FileCheck %s --check-prefix=MM-ABS2K8
15 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+micromips,+abs2008,+fp64 | FileCheck %s --check-prefix=MM-ABS2K8
16 ; RUN: llc < %s -march=mips -mcpu=mips32r2 -mattr=+micromips,+fp64 | FileCheck %s --check-prefix=MM
17 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s --check-prefix=MMR6
19 ; Test that the instruction selection for the case of `abs.s` and `abs.d`
20 ; matches the expected behaviour. In the default case with NaNs and no "abs2008"
21 ; mode MIPS treats abs.s and abs.d as arithmetic fp instructions triggering
22 ; a fp exception on execution if the input is a NaN. This results in no abs.[sd]
23 ; instructions.
25 ; In the case where no NaNs are present is asserted or in "abs2008" mode,
26 ; abs.[sd] instructions are selected.
28 declare double @llvm.fabs.f64(double)
29 declare float @llvm.fabs.f32(float)
31 define dso_local double @foo(double %a) #0 {
32 ; MIPS32R1-LABEL: foo:
33 ; MIPS32R1:       # %bb.0: # %entry
34 ; MIPS32R1-NEXT:    jr $ra
35 ; MIPS32R1-NEXT:    abs.d $f0, $f12
37 ; MIPS32R2-LABEL: foo:
38 ; MIPS32R2:       # %bb.0: # %entry
39 ; MIPS32R2-NEXT:    jr $ra
40 ; MIPS32R2-NEXT:    abs.d $f0, $f12
42 ; MIPS32R2-ABS2K8-LABEL: foo:
43 ; MIPS32R2-ABS2K8:       # %bb.0: # %entry
44 ; MIPS32R2-ABS2K8-NEXT:    jr $ra
45 ; MIPS32R2-ABS2K8-NEXT:    abs.d $f0, $f12
47 ; MIPS32R6-LABEL: foo:
48 ; MIPS32R6:       # %bb.0: # %entry
49 ; MIPS32R6-NEXT:    jr $ra
50 ; MIPS32R6-NEXT:    abs.d $f0, $f12
52 ; MIPS64R1-LABEL: foo:
53 ; MIPS64R1:       # %bb.0: # %entry
54 ; MIPS64R1-NEXT:    jr $ra
55 ; MIPS64R1-NEXT:    abs.d $f0, $f12
57 ; MIPS64R2-LABEL: foo:
58 ; MIPS64R2:       # %bb.0: # %entry
59 ; MIPS64R2-NEXT:    jr $ra
60 ; MIPS64R2-NEXT:    abs.d $f0, $f12
62 ; MIPS64R2-ABS2K8-LABEL: foo:
63 ; MIPS64R2-ABS2K8:       # %bb.0: # %entry
64 ; MIPS64R2-ABS2K8-NEXT:    jr $ra
65 ; MIPS64R2-ABS2K8-NEXT:    abs.d $f0, $f12
67 ; MIPS64R6-LABEL: foo:
68 ; MIPS64R6:       # %bb.0: # %entry
69 ; MIPS64R6-NEXT:    jr $ra
70 ; MIPS64R6-NEXT:    abs.d $f0, $f12
72 ; MIPS64R6-ABS2K8-LABEL: foo:
73 ; MIPS64R6-ABS2K8:       # %bb.0: # %entry
74 ; MIPS64R6-ABS2K8-NEXT:    jr $ra
75 ; MIPS64R6-ABS2K8-NEXT:    abs.d $f0, $f12
77 ; MM-LABEL: foo:
78 ; MM:       # %bb.0: # %entry
79 ; MM-NEXT:    jr $ra
80 ; MM-NEXT:    abs.d $f0, $f12
82 ; MM-ABS2K8-LABEL: foo:
83 ; MM-ABS2K8:       # %bb.0: # %entry
84 ; MM-ABS2K8-NEXT:    jr $ra
85 ; MM-ABS2K8-NEXT:    abs.d $f0, $f12
87 ; MMR6-LABEL: foo:
88 ; MMR6:       # %bb.0: # %entry
89 ; MMR6-NEXT:    abs.d $f0, $f12
90 ; MMR6-NEXT:    jrc $ra
91 entry:
92   %0 = tail call fast double @llvm.fabs.f64(double %a)
93   ret double %0
96 define dso_local double @bar(double %a) {
97 ; MIPS32R1-LABEL: bar:
98 ; MIPS32R1:       # %bb.0: # %entry
99 ; MIPS32R1-NEXT:    lui $1, 32767
100 ; MIPS32R1-NEXT:    ori $1, $1, 65535
101 ; MIPS32R1-NEXT:    mfc1 $2, $f13
102 ; MIPS32R1-NEXT:    and $1, $2, $1
103 ; MIPS32R1-NEXT:    mfc1 $2, $f12
104 ; MIPS32R1-NEXT:    mtc1 $2, $f0
105 ; MIPS32R1-NEXT:    jr $ra
106 ; MIPS32R1-NEXT:    mtc1 $1, $f1
108 ; MIPS32R2-LABEL: bar:
109 ; MIPS32R2:       # %bb.0: # %entry
110 ; MIPS32R2-NEXT:    mfc1 $1, $f12
111 ; MIPS32R2-NEXT:    mfhc1 $2, $f12
112 ; MIPS32R2-NEXT:    ins $2, $zero, 31, 1
113 ; MIPS32R2-NEXT:    mtc1 $1, $f0
114 ; MIPS32R2-NEXT:    mthc1 $2, $f0
115 ; MIPS32R2-NEXT:    jr $ra
116 ; MIPS32R2-NEXT:    nop
118 ; MIPS32R2-ABS2K8-LABEL: bar:
119 ; MIPS32R2-ABS2K8:       # %bb.0: # %entry
120 ; MIPS32R2-ABS2K8-NEXT:    jr $ra
121 ; MIPS32R2-ABS2K8-NEXT:    abs.d $f0, $f12
123 ; MIPS32R6-LABEL: bar:
124 ; MIPS32R6:       # %bb.0: # %entry
125 ; MIPS32R6-NEXT:    jr $ra
126 ; MIPS32R6-NEXT:    abs.d $f0, $f12
128 ; MIPS64R1-LABEL: bar:
129 ; MIPS64R1:       # %bb.0: # %entry
130 ; MIPS64R1-NEXT:    dmfc1 $1, $f12
131 ; MIPS64R1-NEXT:    daddiu $2, $zero, 1
132 ; MIPS64R1-NEXT:    dsll $2, $2, 63
133 ; MIPS64R1-NEXT:    daddiu $2, $2, -1
134 ; MIPS64R1-NEXT:    and $1, $1, $2
135 ; MIPS64R1-NEXT:    jr $ra
136 ; MIPS64R1-NEXT:    dmtc1 $1, $f0
138 ; MIPS64R2-LABEL: bar:
139 ; MIPS64R2:       # %bb.0: # %entry
140 ; MIPS64R2-NEXT:    dmfc1 $1, $f12
141 ; MIPS64R2-NEXT:    dinsu $1, $zero, 63, 1
142 ; MIPS64R2-NEXT:    jr $ra
143 ; MIPS64R2-NEXT:    dmtc1 $1, $f0
145 ; MIPS64R2-ABS2K8-LABEL: bar:
146 ; MIPS64R2-ABS2K8:       # %bb.0: # %entry
147 ; MIPS64R2-ABS2K8-NEXT:    jr $ra
148 ; MIPS64R2-ABS2K8-NEXT:    abs.d $f0, $f12
150 ; MIPS64R6-LABEL: bar:
151 ; MIPS64R6:       # %bb.0: # %entry
152 ; MIPS64R6-NEXT:    jr $ra
153 ; MIPS64R6-NEXT:    abs.d $f0, $f12
155 ; MIPS64R6-ABS2K8-LABEL: bar:
156 ; MIPS64R6-ABS2K8:       # %bb.0: # %entry
157 ; MIPS64R6-ABS2K8-NEXT:    jr $ra
158 ; MIPS64R6-ABS2K8-NEXT:    abs.d $f0, $f12
160 ; MM-LABEL: bar:
161 ; MM:       # %bb.0: # %entry
162 ; MM-NEXT:    mfc1 $1, $f12
163 ; MM-NEXT:    mfhc1 $2, $f12
164 ; MM-NEXT:    ins $2, $zero, 31, 1
165 ; MM-NEXT:    mtc1 $1, $f0
166 ; MM-NEXT:    mthc1 $2, $f0
167 ; MM-NEXT:    jrc $ra
169 ; MM-ABS2K8-LABEL: bar:
170 ; MM-ABS2K8:       # %bb.0: # %entry
171 ; MM-ABS2K8-NEXT:    jr $ra
172 ; MM-ABS2K8-NEXT:    abs.d $f0, $f12
174 ; MMR6-LABEL: bar:
175 ; MMR6:       # %bb.0: # %entry
176 ; MMR6-NEXT:    abs.d $f0, $f12
177 ; MMR6-NEXT:    jrc $ra
178 entry:
179   %0 = tail call fast double @llvm.fabs.f64(double %a)
180   ret double %0
183 define dso_local float @foo_2(float %a) #0 {
184 ; MIPS32R1-LABEL: foo_2:
185 ; MIPS32R1:       # %bb.0: # %entry
186 ; MIPS32R1-NEXT:    jr $ra
187 ; MIPS32R1-NEXT:    abs.s $f0, $f12
189 ; MIPS32R2-LABEL: foo_2:
190 ; MIPS32R2:       # %bb.0: # %entry
191 ; MIPS32R2-NEXT:    jr $ra
192 ; MIPS32R2-NEXT:    abs.s $f0, $f12
194 ; MIPS32R2-ABS2K8-LABEL: foo_2:
195 ; MIPS32R2-ABS2K8:       # %bb.0: # %entry
196 ; MIPS32R2-ABS2K8-NEXT:    jr $ra
197 ; MIPS32R2-ABS2K8-NEXT:    abs.s $f0, $f12
199 ; MIPS32R6-LABEL: foo_2:
200 ; MIPS32R6:       # %bb.0: # %entry
201 ; MIPS32R6-NEXT:    jr $ra
202 ; MIPS32R6-NEXT:    abs.s $f0, $f12
204 ; MIPS64R1-LABEL: foo_2:
205 ; MIPS64R1:       # %bb.0: # %entry
206 ; MIPS64R1-NEXT:    jr $ra
207 ; MIPS64R1-NEXT:    abs.s $f0, $f12
209 ; MIPS64R2-LABEL: foo_2:
210 ; MIPS64R2:       # %bb.0: # %entry
211 ; MIPS64R2-NEXT:    jr $ra
212 ; MIPS64R2-NEXT:    abs.s $f0, $f12
214 ; MIPS64R2-ABS2K8-LABEL: foo_2:
215 ; MIPS64R2-ABS2K8:       # %bb.0: # %entry
216 ; MIPS64R2-ABS2K8-NEXT:    jr $ra
217 ; MIPS64R2-ABS2K8-NEXT:    abs.s $f0, $f12
219 ; MIPS64R6-LABEL: foo_2:
220 ; MIPS64R6:       # %bb.0: # %entry
221 ; MIPS64R6-NEXT:    jr $ra
222 ; MIPS64R6-NEXT:    abs.s $f0, $f12
224 ; MIPS64R6-ABS2K8-LABEL: foo_2:
225 ; MIPS64R6-ABS2K8:       # %bb.0: # %entry
226 ; MIPS64R6-ABS2K8-NEXT:    jr $ra
227 ; MIPS64R6-ABS2K8-NEXT:    abs.s $f0, $f12
229 ; MM-LABEL: foo_2:
230 ; MM:       # %bb.0: # %entry
231 ; MM-NEXT:    jr $ra
232 ; MM-NEXT:    abs.s $f0, $f12
234 ; MM-ABS2K8-LABEL: foo_2:
235 ; MM-ABS2K8:       # %bb.0: # %entry
236 ; MM-ABS2K8-NEXT:    jr $ra
237 ; MM-ABS2K8-NEXT:    abs.s $f0, $f12
239 ; MMR6-LABEL: foo_2:
240 ; MMR6:       # %bb.0: # %entry
241 ; MMR6-NEXT:    abs.s $f0, $f12
242 ; MMR6-NEXT:    jrc $ra
243 entry:
244   %0 = tail call fast float @llvm.fabs.f32(float %a)
245   ret float %0
248 define dso_local float @bar_2(float %a) {
249 ; MIPS32R1-LABEL: bar_2:
250 ; MIPS32R1:       # %bb.0: # %entry
251 ; MIPS32R1-NEXT:    lui $1, 32767
252 ; MIPS32R1-NEXT:    ori $1, $1, 65535
253 ; MIPS32R1-NEXT:    mfc1 $2, $f12
254 ; MIPS32R1-NEXT:    and $1, $2, $1
255 ; MIPS32R1-NEXT:    jr $ra
256 ; MIPS32R1-NEXT:    mtc1 $1, $f0
258 ; MIPS32R2-LABEL: bar_2:
259 ; MIPS32R2:       # %bb.0: # %entry
260 ; MIPS32R2-NEXT:    mfc1 $1, $f12
261 ; MIPS32R2-NEXT:    ins $1, $zero, 31, 1
262 ; MIPS32R2-NEXT:    jr $ra
263 ; MIPS32R2-NEXT:    mtc1 $1, $f0
265 ; MIPS32R2-ABS2K8-LABEL: bar_2:
266 ; MIPS32R2-ABS2K8:       # %bb.0: # %entry
267 ; MIPS32R2-ABS2K8-NEXT:    jr $ra
268 ; MIPS32R2-ABS2K8-NEXT:    abs.s $f0, $f12
270 ; MIPS32R6-LABEL: bar_2:
271 ; MIPS32R6:       # %bb.0: # %entry
272 ; MIPS32R6-NEXT:    jr $ra
273 ; MIPS32R6-NEXT:    abs.s $f0, $f12
275 ; MIPS64R1-LABEL: bar_2:
276 ; MIPS64R1:       # %bb.0: # %entry
277 ; MIPS64R1-NEXT:    lui $1, 32767
278 ; MIPS64R1-NEXT:    ori $1, $1, 65535
279 ; MIPS64R1-NEXT:    mfc1 $2, $f12
280 ; MIPS64R1-NEXT:    and $1, $2, $1
281 ; MIPS64R1-NEXT:    jr $ra
282 ; MIPS64R1-NEXT:    mtc1 $1, $f0
284 ; MIPS64R2-LABEL: bar_2:
285 ; MIPS64R2:       # %bb.0: # %entry
286 ; MIPS64R2-NEXT:    mfc1 $1, $f12
287 ; MIPS64R2-NEXT:    ins $1, $zero, 31, 1
288 ; MIPS64R2-NEXT:    jr $ra
289 ; MIPS64R2-NEXT:    mtc1 $1, $f0
291 ; MIPS64R2-ABS2K8-LABEL: bar_2:
292 ; MIPS64R2-ABS2K8:       # %bb.0: # %entry
293 ; MIPS64R2-ABS2K8-NEXT:    jr $ra
294 ; MIPS64R2-ABS2K8-NEXT:    abs.s $f0, $f12
296 ; MIPS64R6-LABEL: bar_2:
297 ; MIPS64R6:       # %bb.0: # %entry
298 ; MIPS64R6-NEXT:    jr $ra
299 ; MIPS64R6-NEXT:    abs.s $f0, $f12
301 ; MIPS64R6-ABS2K8-LABEL: bar_2:
302 ; MIPS64R6-ABS2K8:       # %bb.0: # %entry
303 ; MIPS64R6-ABS2K8-NEXT:    jr $ra
304 ; MIPS64R6-ABS2K8-NEXT:    abs.s $f0, $f12
306 ; MM-LABEL: bar_2:
307 ; MM:       # %bb.0: # %entry
308 ; MM-NEXT:    mfc1 $1, $f12
309 ; MM-NEXT:    ins $1, $zero, 31, 1
310 ; MM-NEXT:    jr $ra
311 ; MM-NEXT:    mtc1 $1, $f0
313 ; MM-ABS2K8-LABEL: bar_2:
314 ; MM-ABS2K8:       # %bb.0: # %entry
315 ; MM-ABS2K8-NEXT:    jr $ra
316 ; MM-ABS2K8-NEXT:    abs.s $f0, $f12
318 ; MMR6-LABEL: bar_2:
319 ; MMR6:       # %bb.0: # %entry
320 ; MMR6-NEXT:    abs.s $f0, $f12
321 ; MMR6-NEXT:    jrc $ra
322 entry:
323   %0 = tail call fast float @llvm.fabs.f32(float %a)
324   ret float %0
327 attributes #0 = { nounwind "no-nans-fp-math"="true" }