xref: /llvm-project/llvm/test/Transforms/InstCombine/canonicalize-fcmp-inf.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i1 @olt_pinf(half %x) {
5; CHECK-LABEL: define i1 @olt_pinf(
6; CHECK-SAME: half [[X:%.*]]) {
7; CHECK-NEXT:    [[CMP:%.*]] = fcmp one half [[X]], 0xH7C00
8; CHECK-NEXT:    ret i1 [[CMP]]
9;
10  %cmp = fcmp olt half %x, 0xH7c00
11  ret i1 %cmp
12}
13
14define i1 @ole_pinf(half %x) {
15; CHECK-LABEL: define i1 @ole_pinf(
16; CHECK-SAME: half [[X:%.*]]) {
17; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
18; CHECK-NEXT:    ret i1 [[CMP]]
19;
20  %cmp = fcmp ole half %x, 0xH7c00
21  ret i1 %cmp
22}
23
24define i1 @ogt_pinf(half %x) {
25; CHECK-LABEL: define i1 @ogt_pinf(
26; CHECK-SAME: half [[X:%.*]]) {
27; CHECK-NEXT:    ret i1 false
28;
29  %cmp = fcmp ogt half %x, 0xH7c00
30  ret i1 %cmp
31}
32
33define i1 @oge_pinf(half %x) {
34; CHECK-LABEL: define i1 @oge_pinf(
35; CHECK-SAME: half [[X:%.*]]) {
36; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq half [[X]], 0xH7C00
37; CHECK-NEXT:    ret i1 [[CMP]]
38;
39  %cmp = fcmp oge half %x, 0xH7c00
40  ret i1 %cmp
41}
42
43define i1 @ult_pinf(half %x) {
44; CHECK-LABEL: define i1 @ult_pinf(
45; CHECK-SAME: half [[X:%.*]]) {
46; CHECK-NEXT:    [[CMP:%.*]] = fcmp une half [[X]], 0xH7C00
47; CHECK-NEXT:    ret i1 [[CMP]]
48;
49  %cmp = fcmp ult half %x, 0xH7c00
50  ret i1 %cmp
51}
52
53define i1 @ule_pinf(half %x) {
54; CHECK-LABEL: define i1 @ule_pinf(
55; CHECK-SAME: half [[X:%.*]]) {
56; CHECK-NEXT:    ret i1 true
57;
58  %cmp = fcmp ule half %x, 0xH7c00
59  ret i1 %cmp
60}
61
62define i1 @ugt_pinf(half %x) {
63; CHECK-LABEL: define i1 @ugt_pinf(
64; CHECK-SAME: half [[X:%.*]]) {
65; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
66; CHECK-NEXT:    ret i1 [[CMP]]
67;
68  %cmp = fcmp ugt half %x, 0xH7c00
69  ret i1 %cmp
70}
71
72define i1 @uge_pinf(half %x) {
73; CHECK-LABEL: define i1 @uge_pinf(
74; CHECK-SAME: half [[X:%.*]]) {
75; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq half [[X]], 0xH7C00
76; CHECK-NEXT:    ret i1 [[CMP]]
77;
78  %cmp = fcmp uge half %x, 0xH7c00
79  ret i1 %cmp
80}
81
82define i1 @olt_ninf(half %x) {
83; CHECK-LABEL: define i1 @olt_ninf(
84; CHECK-SAME: half [[X:%.*]]) {
85; CHECK-NEXT:    ret i1 false
86;
87  %cmp = fcmp olt half %x, 0xHfc00
88  ret i1 %cmp
89}
90
91define i1 @ole_ninf(half %x) {
92; CHECK-LABEL: define i1 @ole_ninf(
93; CHECK-SAME: half [[X:%.*]]) {
94; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq half [[X]], 0xHFC00
95; CHECK-NEXT:    ret i1 [[CMP]]
96;
97  %cmp = fcmp ole half %x, 0xHfc00
98  ret i1 %cmp
99}
100
101define i1 @ogt_ninf(half %x) {
102; CHECK-LABEL: define i1 @ogt_ninf(
103; CHECK-SAME: half [[X:%.*]]) {
104; CHECK-NEXT:    [[CMP:%.*]] = fcmp one half [[X]], 0xHFC00
105; CHECK-NEXT:    ret i1 [[CMP]]
106;
107  %cmp = fcmp ogt half %x, 0xHfc00
108  ret i1 %cmp
109}
110
111define i1 @oge_ninf(half %x) {
112; CHECK-LABEL: define i1 @oge_ninf(
113; CHECK-SAME: half [[X:%.*]]) {
114; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
115; CHECK-NEXT:    ret i1 [[CMP]]
116;
117  %cmp = fcmp oge half %x, 0xHfc00
118  ret i1 %cmp
119}
120
121define i1 @ult_ninf(half %x) {
122; CHECK-LABEL: define i1 @ult_ninf(
123; CHECK-SAME: half [[X:%.*]]) {
124; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
125; CHECK-NEXT:    ret i1 [[CMP]]
126;
127  %cmp = fcmp ult half %x, 0xHfc00
128  ret i1 %cmp
129}
130
131define i1 @ule_ninf(half %x) {
132; CHECK-LABEL: define i1 @ule_ninf(
133; CHECK-SAME: half [[X:%.*]]) {
134; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq half [[X]], 0xHFC00
135; CHECK-NEXT:    ret i1 [[CMP]]
136;
137  %cmp = fcmp ule half %x, 0xHfc00
138  ret i1 %cmp
139}
140
141define i1 @ugt_ninf(half %x) {
142; CHECK-LABEL: define i1 @ugt_ninf(
143; CHECK-SAME: half [[X:%.*]]) {
144; CHECK-NEXT:    [[CMP:%.*]] = fcmp une half [[X]], 0xHFC00
145; CHECK-NEXT:    ret i1 [[CMP]]
146;
147  %cmp = fcmp ugt half %x, 0xHfc00
148  ret i1 %cmp
149}
150
151define i1 @uge_ninf(half %x) {
152; CHECK-LABEL: define i1 @uge_ninf(
153; CHECK-SAME: half [[X:%.*]]) {
154; CHECK-NEXT:    ret i1 true
155;
156  %cmp = fcmp uge half %x, 0xHfc00
157  ret i1 %cmp
158}
159
160define i1 @olt_pinf_fmf(half %x) {
161; CHECK-LABEL: define i1 @olt_pinf_fmf(
162; CHECK-SAME: half [[X:%.*]]) {
163; CHECK-NEXT:    [[CMP:%.*]] = fcmp nsz one half [[X]], 0xH7C00
164; CHECK-NEXT:    ret i1 [[CMP]]
165;
166  %cmp = fcmp nsz olt half %x, 0xH7c00
167  ret i1 %cmp
168}
169
170define i1 @oge_pinf_fmf(half %x) {
171; CHECK-LABEL: define i1 @oge_pinf_fmf(
172; CHECK-SAME: half [[X:%.*]]) {
173; CHECK-NEXT:    [[CMP:%.*]] = fcmp nnan oeq half [[X]], 0xH7C00
174; CHECK-NEXT:    ret i1 [[CMP]]
175;
176  %cmp = fcmp nnan oge half %x, 0xH7c00
177  ret i1 %cmp
178}
179
180define <2 x i1> @olt_pinf_vec(<2 x half> %x) {
181; CHECK-LABEL: define <2 x i1> @olt_pinf_vec(
182; CHECK-SAME: <2 x half> [[X:%.*]]) {
183; CHECK-NEXT:    [[CMP:%.*]] = fcmp one <2 x half> [[X]], splat (half 0xH7C00)
184; CHECK-NEXT:    ret <2 x i1> [[CMP]]
185;
186  %cmp = fcmp olt <2 x half> %x, <half 0xH7c00, half 0xH7c00>
187  ret <2 x i1> %cmp
188}
189
190define <2 x i1> @oge_ninf_vec(<2 x half> %x) {
191; CHECK-LABEL: define <2 x i1> @oge_ninf_vec(
192; CHECK-SAME: <2 x half> [[X:%.*]]) {
193; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord <2 x half> [[X]], zeroinitializer
194; CHECK-NEXT:    ret <2 x i1> [[CMP]]
195;
196  %cmp = fcmp oge <2 x half> %x, <half 0xHfc00, half 0xHfc00>
197  ret <2 x i1> %cmp
198}
199
200; Negative tests
201
202define i1 @ord_pinf(half %x) {
203; CHECK-LABEL: define i1 @ord_pinf(
204; CHECK-SAME: half [[X:%.*]]) {
205; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
206; CHECK-NEXT:    ret i1 [[CMP]]
207;
208  %cmp = fcmp ord half %x, 0xH7c00
209  ret i1 %cmp
210}
211
212define i1 @uno_pinf(half %x) {
213; CHECK-LABEL: define i1 @uno_pinf(
214; CHECK-SAME: half [[X:%.*]]) {
215; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
216; CHECK-NEXT:    ret i1 [[CMP]]
217;
218  %cmp = fcmp uno half %x, 0xH7c00
219  ret i1 %cmp
220}
221
222define i1 @true_pinf(half %x) {
223; CHECK-LABEL: define i1 @true_pinf(
224; CHECK-SAME: half [[X:%.*]]) {
225; CHECK-NEXT:    ret i1 true
226;
227  %cmp = fcmp true half %x, 0xH7c00
228  ret i1 %cmp
229}
230
231define i1 @false_pinf(half %x) {
232; CHECK-LABEL: define i1 @false_pinf(
233; CHECK-SAME: half [[X:%.*]]) {
234; CHECK-NEXT:    ret i1 false
235;
236  %cmp = fcmp false half %x, 0xH7c00
237  ret i1 %cmp
238}
239
240define i1 @ord_ninf(half %x) {
241; CHECK-LABEL: define i1 @ord_ninf(
242; CHECK-SAME: half [[X:%.*]]) {
243; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord half [[X]], 0xH0000
244; CHECK-NEXT:    ret i1 [[CMP]]
245;
246  %cmp = fcmp ord half %x, 0xHfc00
247  ret i1 %cmp
248}
249
250define i1 @uno_ninf(half %x) {
251; CHECK-LABEL: define i1 @uno_ninf(
252; CHECK-SAME: half [[X:%.*]]) {
253; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno half [[X]], 0xH0000
254; CHECK-NEXT:    ret i1 [[CMP]]
255;
256  %cmp = fcmp uno half %x, 0xHfc00
257  ret i1 %cmp
258}
259
260define i1 @true_ninf(half %x) {
261; CHECK-LABEL: define i1 @true_ninf(
262; CHECK-SAME: half [[X:%.*]]) {
263; CHECK-NEXT:    ret i1 true
264;
265  %cmp = fcmp true half %x, 0xHfc00
266  ret i1 %cmp
267}
268
269define i1 @false_ninf(half %x) {
270; CHECK-LABEL: define i1 @false_ninf(
271; CHECK-SAME: half [[X:%.*]]) {
272; CHECK-NEXT:    ret i1 false
273;
274  %cmp = fcmp false half %x, 0xHfc00
275  ret i1 %cmp
276}
277
278define i1 @olt_one(half %x) {
279; CHECK-LABEL: define i1 @olt_one(
280; CHECK-SAME: half [[X:%.*]]) {
281; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt half [[X]], 0xH3C00
282; CHECK-NEXT:    ret i1 [[CMP]]
283;
284  %cmp = fcmp olt half %x, 1.0
285  ret i1 %cmp
286}
287