xref: /llvm-project/llvm/test/Transforms/InstCombine/canonicalize.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine %s | FileCheck %s
3
4; --------------------------------------------------------------------
5; (@canonicalize(x) == @canonicalize(y)) is equivalent to to (x == y)
6; --------------------------------------------------------------------
7
8define i1 @canonicalize_oeq_canonicalize_f32(float %x, float %y) {
9; CHECK-LABEL: @canonicalize_oeq_canonicalize_f32(
10; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[X:%.*]], [[Y:%.*]]
11; CHECK-NEXT:    ret i1 [[CMP]]
12;
13  %canon.x = call float @llvm.canonicalize.f32(float %x)
14  %canon.y = call float @llvm.canonicalize.f32(float %y)
15  %cmp = fcmp oeq float %canon.x, %canon.y
16  ret i1 %cmp
17}
18
19define i1 @canonicalize_oeq_canonicalize_f32_flags(float %x, float %y) {
20; CHECK-LABEL: @canonicalize_oeq_canonicalize_f32_flags(
21; CHECK-NEXT:    [[CMP:%.*]] = fcmp nsz oeq float [[X:%.*]], [[Y:%.*]]
22; CHECK-NEXT:    ret i1 [[CMP]]
23;
24  %canon.x = call float @llvm.canonicalize.f32(float %x)
25  %canon.y = call float @llvm.canonicalize.f32(float %y)
26  %cmp = fcmp nsz oeq float %canon.x, %canon.y
27  ret i1 %cmp
28}
29
30define <2 x i1> @canonicalize_oeq_canonicalize_v2f32(<2 x float> %x, <2 x float> %y) {
31; CHECK-LABEL: @canonicalize_oeq_canonicalize_v2f32(
32; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq <2 x float> [[X:%.*]], [[Y:%.*]]
33; CHECK-NEXT:    ret <2 x i1> [[CMP]]
34;
35  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
36  %canon.y = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %y)
37  %cmp = fcmp oeq <2 x float> %canon.x, %canon.y
38  ret <2 x i1> %cmp
39}
40
41define i1 @canonicalize_ueq_canonicalize_f32(float %x, float %y) {
42; CHECK-LABEL: @canonicalize_ueq_canonicalize_f32(
43; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq float [[X:%.*]], [[Y:%.*]]
44; CHECK-NEXT:    ret i1 [[CMP]]
45;
46  %canon.x = call float @llvm.canonicalize.f32(float %x)
47  %canon.y = call float @llvm.canonicalize.f32(float %y)
48  %cmp = fcmp ueq float %canon.x, %canon.y
49  ret i1 %cmp
50}
51
52define <2 x i1> @canonicalize_ueq_canonicalize_v2f32(<2 x float> %x, <2 x float> %y) {
53; CHECK-LABEL: @canonicalize_ueq_canonicalize_v2f32(
54; CHECK-NEXT:    [[CMP:%.*]] = fcmp ueq <2 x float> [[X:%.*]], [[Y:%.*]]
55; CHECK-NEXT:    ret <2 x i1> [[CMP]]
56;
57  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
58  %canon.y = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %y)
59  %cmp = fcmp ueq <2 x float> %canon.x, %canon.y
60  ret <2 x i1> %cmp
61}
62
63define i1 @canonicalize_one_canonicalize_f32(float %x, float %y) {
64; CHECK-LABEL: @canonicalize_one_canonicalize_f32(
65; CHECK-NEXT:    [[CMP:%.*]] = fcmp one float [[X:%.*]], [[Y:%.*]]
66; CHECK-NEXT:    ret i1 [[CMP]]
67;
68  %canon.x = call float @llvm.canonicalize.f32(float %x)
69  %canon.y = call float @llvm.canonicalize.f32(float %y)
70  %cmp = fcmp one float %canon.x, %canon.y
71  ret i1 %cmp
72}
73
74define <2 x i1> @canonicalize_one_canonicalize_v2f32(<2 x float> %x, <2 x float> %y) {
75; CHECK-LABEL: @canonicalize_one_canonicalize_v2f32(
76; CHECK-NEXT:    [[CMP:%.*]] = fcmp one <2 x float> [[X:%.*]], [[Y:%.*]]
77; CHECK-NEXT:    ret <2 x i1> [[CMP]]
78;
79  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
80  %canon.y = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %y)
81  %cmp = fcmp one <2 x float> %canon.x, %canon.y
82  ret <2 x i1> %cmp
83}
84
85define i1 @canonicalize_une_canonicalize_f32(float %x, float %y) {
86; CHECK-LABEL: @canonicalize_une_canonicalize_f32(
87; CHECK-NEXT:    [[CMP:%.*]] = fcmp une float [[X:%.*]], [[Y:%.*]]
88; CHECK-NEXT:    ret i1 [[CMP]]
89;
90  %canon.x = call float @llvm.canonicalize.f32(float %x)
91  %canon.y = call float @llvm.canonicalize.f32(float %y)
92  %cmp = fcmp une float %canon.x, %canon.y
93  ret i1 %cmp
94}
95
96define <2 x i1> @canonicalize_une_canonicalize_v2f32(<2 x float> %x, <2 x float> %y) {
97; CHECK-LABEL: @canonicalize_une_canonicalize_v2f32(
98; CHECK-NEXT:    [[CMP:%.*]] = fcmp une <2 x float> [[X:%.*]], [[Y:%.*]]
99; CHECK-NEXT:    ret <2 x i1> [[CMP]]
100;
101  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
102  %canon.y = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %y)
103  %cmp = fcmp une <2 x float> %canon.x, %canon.y
104  ret <2 x i1> %cmp
105}
106
107define i1 @canonicalize_ogt_canonicalize_f32(float %x, float %y) {
108; CHECK-LABEL: @canonicalize_ogt_canonicalize_f32(
109; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]]
110; CHECK-NEXT:    ret i1 [[CMP]]
111;
112  %canon.x = call float @llvm.canonicalize.f32(float %x)
113  %canon.y = call float @llvm.canonicalize.f32(float %y)
114  %cmp = fcmp ogt float %canon.x, %canon.y
115  ret i1 %cmp
116}
117
118define i1 @canonicalize_oge_canonicalize_f32(float %x, float %y) {
119; CHECK-LABEL: @canonicalize_oge_canonicalize_f32(
120; CHECK-NEXT:    [[CMP:%.*]] = fcmp oge float [[X:%.*]], [[Y:%.*]]
121; CHECK-NEXT:    ret i1 [[CMP]]
122;
123  %canon.x = call float @llvm.canonicalize.f32(float %x)
124  %canon.y = call float @llvm.canonicalize.f32(float %y)
125  %cmp = fcmp oge float %canon.x, %canon.y
126  ret i1 %cmp
127}
128
129define i1 @canonicalize_olt_canonicalize_f32(float %x, float %y) {
130; CHECK-LABEL: @canonicalize_olt_canonicalize_f32(
131; CHECK-NEXT:    [[CMP:%.*]] = fcmp olt float [[X:%.*]], [[Y:%.*]]
132; CHECK-NEXT:    ret i1 [[CMP]]
133;
134  %canon.x = call float @llvm.canonicalize.f32(float %x)
135  %canon.y = call float @llvm.canonicalize.f32(float %y)
136  %cmp = fcmp olt float %canon.x, %canon.y
137  ret i1 %cmp
138}
139
140define i1 @canonicalize_ole_canonicalize_f32(float %x, float %y) {
141; CHECK-LABEL: @canonicalize_ole_canonicalize_f32(
142; CHECK-NEXT:    [[CMP:%.*]] = fcmp ole float [[X:%.*]], [[Y:%.*]]
143; CHECK-NEXT:    ret i1 [[CMP]]
144;
145  %canon.x = call float @llvm.canonicalize.f32(float %x)
146  %canon.y = call float @llvm.canonicalize.f32(float %y)
147  %cmp = fcmp ole float %canon.x, %canon.y
148  ret i1 %cmp
149}
150
151define i1 @canonicalize_ord_canonicalize_f32(float %x, float %y) {
152; CHECK-LABEL: @canonicalize_ord_canonicalize_f32(
153; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord float [[X:%.*]], [[Y:%.*]]
154; CHECK-NEXT:    ret i1 [[CMP]]
155;
156  %canon.x = call float @llvm.canonicalize.f32(float %x)
157  %canon.y = call float @llvm.canonicalize.f32(float %y)
158  %cmp = fcmp ord float %canon.x, %canon.y
159  ret i1 %cmp
160}
161
162define i1 @canonicalize_ugt_canonicalize_f32(float %x, float %y) {
163; CHECK-LABEL: @canonicalize_ugt_canonicalize_f32(
164; CHECK-NEXT:    [[CMP:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]]
165; CHECK-NEXT:    ret i1 [[CMP]]
166;
167  %canon.x = call float @llvm.canonicalize.f32(float %x)
168  %canon.y = call float @llvm.canonicalize.f32(float %y)
169  %cmp = fcmp ugt float %canon.x, %canon.y
170  ret i1 %cmp
171}
172
173define i1 @canonicalize_uge_canonicalize_f32(float %x, float %y) {
174; CHECK-LABEL: @canonicalize_uge_canonicalize_f32(
175; CHECK-NEXT:    [[CMP:%.*]] = fcmp uge float [[X:%.*]], [[Y:%.*]]
176; CHECK-NEXT:    ret i1 [[CMP]]
177;
178  %canon.x = call float @llvm.canonicalize.f32(float %x)
179  %canon.y = call float @llvm.canonicalize.f32(float %y)
180  %cmp = fcmp uge float %canon.x, %canon.y
181  ret i1 %cmp
182}
183
184define i1 @canonicalize_ult_canonicalize_f32(float %x, float %y) {
185; CHECK-LABEL: @canonicalize_ult_canonicalize_f32(
186; CHECK-NEXT:    [[CMP:%.*]] = fcmp ult float [[X:%.*]], [[Y:%.*]]
187; CHECK-NEXT:    ret i1 [[CMP]]
188;
189  %canon.x = call float @llvm.canonicalize.f32(float %x)
190  %canon.y = call float @llvm.canonicalize.f32(float %y)
191  %cmp = fcmp ult float %canon.x, %canon.y
192  ret i1 %cmp
193}
194
195define i1 @canonicalize_ule_canonicalize_f32(float %x, float %y) {
196; CHECK-LABEL: @canonicalize_ule_canonicalize_f32(
197; CHECK-NEXT:    [[CMP:%.*]] = fcmp ule float [[X:%.*]], [[Y:%.*]]
198; CHECK-NEXT:    ret i1 [[CMP]]
199;
200  %canon.x = call float @llvm.canonicalize.f32(float %x)
201  %canon.y = call float @llvm.canonicalize.f32(float %y)
202  %cmp = fcmp ule float %canon.x, %canon.y
203  ret i1 %cmp
204}
205
206define i1 @canonicalize_uno_canonicalize_f32(float %x, float %y) {
207; CHECK-LABEL: @canonicalize_uno_canonicalize_f32(
208; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[X:%.*]], [[Y:%.*]]
209; CHECK-NEXT:    ret i1 [[CMP]]
210;
211  %canon.x = call float @llvm.canonicalize.f32(float %x)
212  %canon.y = call float @llvm.canonicalize.f32(float %y)
213  %cmp = fcmp uno float %canon.x, %canon.y
214  ret i1 %cmp
215}
216
217define i1 @canonicalize_oeq_y_f32() {
218; CHECK-LABEL: @canonicalize_oeq_y_f32(
219; CHECK-NEXT:    [[X:%.*]] = call float @gen_f32()
220; CHECK-NEXT:    [[Y:%.*]] = call float @gen_f32()
221; CHECK-NEXT:    [[CANON_X:%.*]] = call float @llvm.canonicalize.f32(float [[X]])
222; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[CANON_X]], [[Y]]
223; CHECK-NEXT:    ret i1 [[CMP]]
224;
225  %x = call float @gen_f32()
226  %y = call float @gen_f32()
227  %canon.x = call float @llvm.canonicalize.f32(float %x)
228  %cmp = fcmp oeq float %canon.x, %y
229  ret i1 %cmp
230}
231
232define i1 @canonicalize_oeq_y_commute_f32() {
233; CHECK-LABEL: @canonicalize_oeq_y_commute_f32(
234; CHECK-NEXT:    [[X:%.*]] = call float @gen_f32()
235; CHECK-NEXT:    [[Y:%.*]] = call float @gen_f32()
236; CHECK-NEXT:    [[CANON_Y:%.*]] = call float @llvm.canonicalize.f32(float [[Y]])
237; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[X]], [[CANON_Y]]
238; CHECK-NEXT:    ret i1 [[CMP]]
239;
240  %x = call float @gen_f32()
241  %y = call float @gen_f32()
242  %canon.y = call float @llvm.canonicalize.f32(float %y)
243  %cmp = fcmp oeq float %x, %canon.y
244  ret i1 %cmp
245}
246
247; --------------------------------------------------------------------
248; (@canonicalize(x) == x) is equivalent to (x == x)
249; --------------------------------------------------------------------
250
251define i1 @canonicalize_oeq_arg_f32(float %x) {
252; CHECK-LABEL: @canonicalize_oeq_arg_f32(
253; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
254; CHECK-NEXT:    ret i1 [[CMP]]
255;
256  %canon.x = call float @llvm.canonicalize.f32(float %x)
257  %cmp = fcmp oeq float %canon.x, %x
258  ret i1 %cmp
259}
260
261define i1 @canonicalize_oeq_arg_f32_flags(float %x) {
262; CHECK-LABEL: @canonicalize_oeq_arg_f32_flags(
263; CHECK-NEXT:    [[CMP:%.*]] = fcmp nsz ord float [[X:%.*]], 0.000000e+00
264; CHECK-NEXT:    ret i1 [[CMP]]
265;
266  %canon.x = call float @llvm.canonicalize.f32(float %x)
267  %cmp = fcmp nsz oeq float %canon.x, %x
268  ret i1 %cmp
269}
270
271declare float @gen_f32()
272declare <2 x float> @gen_v2f32()
273
274define i1 @canonicalize_oeq_arg_f32_commute() {
275; CHECK-LABEL: @canonicalize_oeq_arg_f32_commute(
276; CHECK-NEXT:    [[X:%.*]] = call float @gen_f32()
277; CHECK-NEXT:    [[CMP:%.*]] = fcmp nsz ord float [[X]], 0.000000e+00
278; CHECK-NEXT:    ret i1 [[CMP]]
279;
280  %x = call float @gen_f32() ; thwart complexity-based canonicalization
281  %canon.x = call float @llvm.canonicalize.f32(float %x)
282  %cmp = fcmp nsz oeq float %x, %canon.x
283  ret i1 %cmp
284}
285
286define <2 x i1> @canonicalize_oeq_arg_v2f32(<2 x float> %x) {
287; CHECK-LABEL: @canonicalize_oeq_arg_v2f32(
288; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord <2 x float> [[X:%.*]], zeroinitializer
289; CHECK-NEXT:    ret <2 x i1> [[CMP]]
290;
291  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
292  %cmp = fcmp oeq <2 x float> %canon.x, %x
293  ret <2 x i1> %cmp
294}
295
296define <2 x i1> @canonicalize_oeq_arg_v2f32_commute() {
297; CHECK-LABEL: @canonicalize_oeq_arg_v2f32_commute(
298; CHECK-NEXT:    [[X:%.*]] = call <2 x float> @gen_v2f32()
299; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord <2 x float> [[X]], zeroinitializer
300; CHECK-NEXT:    ret <2 x i1> [[CMP]]
301;
302  %x = call <2 x float> @gen_v2f32() ; thwart complexity-based canonicalization
303  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
304  %cmp = fcmp oeq <2 x float> %x, %canon.x
305  ret <2 x i1> %cmp
306}
307
308define i1 @canonicalize_ueq_arg_f32(float %x) {
309; CHECK-LABEL: @canonicalize_ueq_arg_f32(
310; CHECK-NEXT:    ret i1 true
311;
312  %canon.x = call float @llvm.canonicalize.f32(float %x)
313  %cmp = fcmp ueq float %canon.x, %x
314  ret i1 %cmp
315}
316
317define <2 x i1> @canonicalize_ueq_arg_v2f32(<2 x float> %x) {
318; CHECK-LABEL: @canonicalize_ueq_arg_v2f32(
319; CHECK-NEXT:    ret <2 x i1> splat (i1 true)
320;
321  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
322  %cmp = fcmp ueq <2 x float> %canon.x, %x
323  ret <2 x i1> %cmp
324}
325
326define i1 @canonicalize_one_arg_f32(float %x) {
327; CHECK-LABEL: @canonicalize_one_arg_f32(
328; CHECK-NEXT:    ret i1 false
329;
330  %canon.x = call float @llvm.canonicalize.f32(float %x)
331  %cmp = fcmp one float %canon.x, %x
332  ret i1 %cmp
333}
334
335define <2 x i1> @canonicalize_one_arg_v2f32(<2 x float> %x) {
336; CHECK-LABEL: @canonicalize_one_arg_v2f32(
337; CHECK-NEXT:    ret <2 x i1> zeroinitializer
338;
339  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
340  %cmp = fcmp one <2 x float> %canon.x, %x
341  ret <2 x i1> %cmp
342}
343
344define i1 @canonicalize_une_arg_f32(float %x) {
345; CHECK-LABEL: @canonicalize_une_arg_f32(
346; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
347; CHECK-NEXT:    ret i1 [[CMP]]
348;
349  %canon.x = call float @llvm.canonicalize.f32(float %x)
350  %cmp = fcmp une float %canon.x, %x
351  ret i1 %cmp
352}
353
354define <2 x i1> @canonicalize_une_arg_v2f32(<2 x float> %x) {
355; CHECK-LABEL: @canonicalize_une_arg_v2f32(
356; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno <2 x float> [[X:%.*]], zeroinitializer
357; CHECK-NEXT:    ret <2 x i1> [[CMP]]
358;
359  %canon.x = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
360  %cmp = fcmp une <2 x float> %canon.x, %x
361  ret <2 x i1> %cmp
362}
363
364define i1 @canonicalize_ogt_arg_f32(float %x) {
365; CHECK-LABEL: @canonicalize_ogt_arg_f32(
366; CHECK-NEXT:    ret i1 false
367;
368  %canon.x = call float @llvm.canonicalize.f32(float %x)
369  %cmp = fcmp ogt float %canon.x, %x
370  ret i1 %cmp
371}
372
373define i1 @canonicalize_oge_arg_f32(float %x) {
374; CHECK-LABEL: @canonicalize_oge_arg_f32(
375; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
376; CHECK-NEXT:    ret i1 [[CMP]]
377;
378  %canon.x = call float @llvm.canonicalize.f32(float %x)
379  %cmp = fcmp oge float %canon.x, %x
380  ret i1 %cmp
381}
382
383define i1 @canonicalize_olt_arg_f32(float %x) {
384; CHECK-LABEL: @canonicalize_olt_arg_f32(
385; CHECK-NEXT:    ret i1 false
386;
387  %canon.x = call float @llvm.canonicalize.f32(float %x)
388  %cmp = fcmp olt float %canon.x, %x
389  ret i1 %cmp
390}
391
392define i1 @canonicalize_ole_arg_f32(float %x) {
393; CHECK-LABEL: @canonicalize_ole_arg_f32(
394; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
395; CHECK-NEXT:    ret i1 [[CMP]]
396;
397  %canon.x = call float @llvm.canonicalize.f32(float %x)
398  %cmp = fcmp ole float %canon.x, %x
399  ret i1 %cmp
400}
401
402define i1 @canonicalize_ord_arg_f32(float %x) {
403; CHECK-LABEL: @canonicalize_ord_arg_f32(
404; CHECK-NEXT:    [[CMP:%.*]] = fcmp ord float [[X:%.*]], 0.000000e+00
405; CHECK-NEXT:    ret i1 [[CMP]]
406;
407  %canon.x = call float @llvm.canonicalize.f32(float %x)
408  %cmp = fcmp ord float %canon.x, %x
409  ret i1 %cmp
410}
411
412define i1 @canonicalize_ugt_arg_f32(float %x) {
413; CHECK-LABEL: @canonicalize_ugt_arg_f32(
414; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
415; CHECK-NEXT:    ret i1 [[CMP]]
416;
417  %canon.x = call float @llvm.canonicalize.f32(float %x)
418  %cmp = fcmp ugt float %canon.x, %x
419  ret i1 %cmp
420}
421
422define i1 @canonicalize_uge_arg_f32(float %x) {
423; CHECK-LABEL: @canonicalize_uge_arg_f32(
424; CHECK-NEXT:    ret i1 true
425;
426  %canon.x = call float @llvm.canonicalize.f32(float %x)
427  %cmp = fcmp uge float %canon.x, %x
428  ret i1 %cmp
429}
430
431define i1 @canonicalize_ult_arg_f32(float %x) {
432; CHECK-LABEL: @canonicalize_ult_arg_f32(
433; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
434; CHECK-NEXT:    ret i1 [[CMP]]
435;
436  %canon.x = call float @llvm.canonicalize.f32(float %x)
437  %cmp = fcmp ult float %canon.x, %x
438  ret i1 %cmp
439}
440
441define i1 @canonicalize_ule_arg_f32(float %x) {
442; CHECK-LABEL: @canonicalize_ule_arg_f32(
443; CHECK-NEXT:    ret i1 true
444;
445  %canon.x = call float @llvm.canonicalize.f32(float %x)
446  %cmp = fcmp ule float %canon.x, %x
447  ret i1 %cmp
448}
449
450define i1 @canonicalize_uno_arg_f32(float %x) {
451; CHECK-LABEL: @canonicalize_uno_arg_f32(
452; CHECK-NEXT:    [[CMP:%.*]] = fcmp uno float [[X:%.*]], 0.000000e+00
453; CHECK-NEXT:    ret i1 [[CMP]]
454;
455  %canon.x = call float @llvm.canonicalize.f32(float %x)
456  %cmp = fcmp uno float %canon.x, %x
457  ret i1 %cmp
458}
459
460; --------------------------------------------------------------------
461; Others
462; --------------------------------------------------------------------
463
464; Regression test checking that the vector version of llvm.canonicalize works.
465define <2 x i1> @vec_canonicalize_with_fpclass(<2 x float> %x) {
466; CHECK-LABEL: @vec_canonicalize_with_fpclass(
467; CHECK-NEXT:    ret <2 x i1> zeroinitializer
468;
469  %canon = call <2 x float> @llvm.canonicalize.v2f32(<2 x float> %x)
470  %fpclass = call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %canon, i32 1)
471  ret <2 x i1> %fpclass
472}
473
474declare float @llvm.canonicalize.f32(float)
475declare <2 x float> @llvm.canonicalize.v2f32(<2 x float>)
476declare <2 x i1> @llvm.is.fpclass.v2f32(<2 x float>, i32 immarg)
477