ELF: Have __rela_iplt_{start,end} surround .rela.iplt with --pack-dyn-relocs=android.
[llvm-project.git] / llvm / test / Transforms / InstCombine / binop-itofp.ll
blob702bbbbf7d17604146d1ec5be722a5e5cb50786f
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
4 define half @test_ui_ui_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
5 ; CHECK-LABEL: @test_ui_ui_i8_add(
6 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 127
7 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 127
8 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i8 [[X]], [[Y]]
9 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
10 ; CHECK-NEXT:    ret half [[R]]
12   %x = and i8 %x_in, 127
13   %y = and i8 %y_in, 127
14   %xf = uitofp i8 %x to half
15   %yf = uitofp i8 %y to half
16   %r = fadd half %xf, %yf
17   ret half %r
20 define half @test_ui_ui_i8_add_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
21 ; CHECK-LABEL: @test_ui_ui_i8_add_fail_overflow(
22 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 127
23 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], -127
24 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
25 ; CHECK-NEXT:    [[YF:%.*]] = uitofp i8 [[Y]] to half
26 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
27 ; CHECK-NEXT:    ret half [[R]]
29   %x = and i8 %x_in, 127
30   %y = and i8 %y_in, 129
31   %xf = uitofp i8 %x to half
32   %yf = uitofp i8 %y to half
33   %r = fadd half %xf, %yf
34   ret half %r
37 define half @test_ui_ui_i8_add_C(i8 noundef %x_in) {
38 ; CHECK-LABEL: @test_ui_ui_i8_add_C(
39 ; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X_IN:%.*]], -128
40 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
41 ; CHECK-NEXT:    ret half [[R]]
43   %x = and i8 %x_in, 127
44   %xf = uitofp i8 %x to half
45   %r = fadd half %xf, 128.0
46   ret half %r
49 define half @test_ui_ui_i8_add_C_fail_no_repr(i8 noundef %x_in) {
50 ; CHECK-LABEL: @test_ui_ui_i8_add_C_fail_no_repr(
51 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 127
52 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
53 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], 0xH57F8
54 ; CHECK-NEXT:    ret half [[R]]
56   %x = and i8 %x_in, 127
57   %xf = uitofp i8 %x to half
58   %r = fadd half %xf, 127.5
59   ret half %r
62 define half @test_ui_ui_i8_add_C_fail_overflow(i8 noundef %x_in) {
63 ; CHECK-LABEL: @test_ui_ui_i8_add_C_fail_overflow(
64 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 127
65 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
66 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], 0xH5808
67 ; CHECK-NEXT:    ret half [[R]]
69   %x = and i8 %x_in, 127
70   %xf = uitofp i8 %x to half
71   %r = fadd half %xf, 129.0
72   ret half %r
75 define half @test_si_si_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
76 ; CHECK-LABEL: @test_si_si_i8_add(
77 ; CHECK-NEXT:    [[X:%.*]] = or i8 [[X_IN:%.*]], -64
78 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -64
79 ; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i8 [[X]], [[Y]]
80 ; CHECK-NEXT:    [[R:%.*]] = sitofp i8 [[TMP1]] to half
81 ; CHECK-NEXT:    ret half [[R]]
83   %x = or i8 %x_in, -64
84   %y = or i8 %y_in, -64
85   %xf = sitofp i8 %x to half
86   %yf = sitofp i8 %y to half
87   %r = fadd half %xf, %yf
88   ret half %r
91 define half @test_si_si_i8_add_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
92 ; CHECK-LABEL: @test_si_si_i8_add_fail_overflow(
93 ; CHECK-NEXT:    [[X:%.*]] = or i8 [[X_IN:%.*]], -64
94 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -65
95 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i8 [[X]] to half
96 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i8 [[Y]] to half
97 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
98 ; CHECK-NEXT:    ret half [[R]]
100   %x = or i8 %x_in, -64
101   %y = or i8 %y_in, -65
102   %xf = sitofp i8 %x to half
103   %yf = sitofp i8 %y to half
104   %r = fadd half %xf, %yf
105   ret half %r
108 define half @test_ui_si_i8_add(i8 noundef %x_in, i8 noundef %y_in) {
109 ; CHECK-LABEL: @test_ui_si_i8_add(
110 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 63
111 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
112 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw nsw i8 [[X]], [[Y]]
113 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
114 ; CHECK-NEXT:    ret half [[R]]
116   %x = and i8 %x_in, 63
117   %y = and i8 %y_in, 63
118   %xf = sitofp i8 %x to half
119   %yf = uitofp i8 %y to half
120   %r = fadd half %xf, %yf
121   ret half %r
124 define half @test_ui_si_i8_add_overflow(i8 noundef %x_in, i8 noundef %y_in) {
125 ; CHECK-LABEL: @test_ui_si_i8_add_overflow(
126 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 63
127 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 65
128 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i8 [[X]], [[Y]]
129 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
130 ; CHECK-NEXT:    ret half [[R]]
132   %x = and i8 %x_in, 63
133   %y = and i8 %y_in, 65
134   %xf = sitofp i8 %x to half
135   %yf = uitofp i8 %y to half
136   %r = fadd half %xf, %yf
137   ret half %r
140 define half @test_ui_ui_i8_sub_C(i8 noundef %x_in) {
141 ; CHECK-LABEL: @test_ui_ui_i8_sub_C(
142 ; CHECK-NEXT:    [[TMP1:%.*]] = and i8 [[X_IN:%.*]], 127
143 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
144 ; CHECK-NEXT:    ret half [[R]]
146   %x = or i8 %x_in, 128
147   %xf = uitofp i8 %x to half
148   %r = fsub half %xf, 128.0
149   ret half %r
152 define half @test_ui_ui_i8_sub_C_fail_overflow(i8 noundef %x_in) {
153 ; CHECK-LABEL: @test_ui_ui_i8_sub_C_fail_overflow(
154 ; CHECK-NEXT:    [[TMP1:%.*]] = or i8 [[X_IN:%.*]], -128
155 ; CHECK-NEXT:    [[R:%.*]] = sitofp i8 [[TMP1]] to half
156 ; CHECK-NEXT:    ret half [[R]]
158   %x = and i8 %x_in, 127
159   %xf = uitofp i8 %x to half
160   %r = fsub half %xf, 128.0
161   ret half %r
164 define half @test_si_si_i8_sub(i8 noundef %x_in, i8 noundef %y_in) {
165 ; CHECK-LABEL: @test_si_si_i8_sub(
166 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 63
167 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -64
168 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i8 [[X]], [[Y]]
169 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
170 ; CHECK-NEXT:    ret half [[R]]
172   %x = and i8 %x_in, 63
173   %y = or i8 %y_in, -64
174   %xf = sitofp i8 %x to half
175   %yf = sitofp i8 %y to half
176   %r = fsub half %xf, %yf
177   ret half %r
180 define half @test_si_si_i8_sub_fail_overflow(i8 noundef %x_in, i8 noundef %y_in) {
181 ; CHECK-LABEL: @test_si_si_i8_sub_fail_overflow(
182 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 63
183 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -65
184 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
185 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i8 [[Y]] to half
186 ; CHECK-NEXT:    [[R:%.*]] = fsub half [[XF]], [[YF]]
187 ; CHECK-NEXT:    ret half [[R]]
189   %x = and i8 %x_in, 63
190   %y = or i8 %y_in, -65
191   %xf = sitofp i8 %x to half
192   %yf = sitofp i8 %y to half
193   %r = fsub half %xf, %yf
194   ret half %r
197 define half @test_si_si_i8_sub_C(i8 noundef %x_in) {
198 ; CHECK-LABEL: @test_si_si_i8_sub_C(
199 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 63
200 ; CHECK-NEXT:    [[TMP1:%.*]] = or disjoint i8 [[X]], 64
201 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
202 ; CHECK-NEXT:    ret half [[R]]
204   %x = and i8 %x_in, 63
205   %xf = sitofp i8 %x to half
206   %r = fsub half %xf, -64.0
207   ret half %r
210 define half @test_si_si_i8_sub_C_fail_overflow(i8 noundef %x_in) {
211 ; CHECK-LABEL: @test_si_si_i8_sub_C_fail_overflow(
212 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 65
213 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i8 [[X]], 64
214 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
215 ; CHECK-NEXT:    ret half [[R]]
217   %x = and i8 %x_in, 65
218   %xf = sitofp i8 %x to half
219   %r = fsub half %xf, -64.0
220   ret half %r
223 define half @test_ui_si_i8_sub(i8 noundef %x_in, i8 noundef %y_in) {
224 ; CHECK-LABEL: @test_ui_si_i8_sub(
225 ; CHECK-NEXT:    [[X:%.*]] = or i8 [[X_IN:%.*]], 64
226 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
227 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nuw nsw i8 [[X]], [[Y]]
228 ; CHECK-NEXT:    [[R:%.*]] = sitofp i8 [[TMP1]] to half
229 ; CHECK-NEXT:    ret half [[R]]
231   %x = or i8 %x_in, 64
232   %y = and i8 %y_in, 63
233   %xf = sitofp i8 %x to half
234   %yf = uitofp i8 %y to half
235   %r = fsub half %xf, %yf
236   ret half %r
239 define half @test_ui_si_i8_sub_fail_maybe_sign(i8 noundef %x_in, i8 noundef %y_in) {
240 ; CHECK-LABEL: @test_ui_si_i8_sub_fail_maybe_sign(
241 ; CHECK-NEXT:    [[X:%.*]] = or i8 [[X_IN:%.*]], 64
242 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 63
243 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nuw nsw i8 [[X]], [[Y]]
244 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
245 ; CHECK-NEXT:    ret half [[R]]
247   %x = or i8 %x_in, 64
248   %y = and i8 %y_in, 63
249   %xf = uitofp i8 %x to half
250   %yf = sitofp i8 %y to half
251   %r = fsub half %xf, %yf
252   ret half %r
255 define half @test_ui_ui_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
256 ; CHECK-LABEL: @test_ui_ui_i8_mul(
257 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 15
258 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 15
259 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw i8 [[X]], [[Y]]
260 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[TMP1]] to half
261 ; CHECK-NEXT:    ret half [[R]]
263   %x = and i8 %x_in, 15
264   %y = and i8 %y_in, 15
265   %xf = uitofp i8 %x to half
266   %yf = uitofp i8 %y to half
267   %r = fmul half %xf, %yf
268   ret half %r
271 define half @test_ui_ui_i8_mul_C(i8 noundef %x_in) {
272 ; CHECK-LABEL: @test_ui_ui_i8_mul_C(
273 ; CHECK-NEXT:    [[X:%.*]] = shl i8 [[X_IN:%.*]], 4
274 ; CHECK-NEXT:    [[R:%.*]] = uitofp i8 [[X]] to half
275 ; CHECK-NEXT:    ret half [[R]]
277   %x = and i8 %x_in, 15
278   %xf = uitofp i8 %x to half
279   %r = fmul half %xf, 16.0
280   ret half %r
283 define half @test_ui_ui_i8_mul_C_fail_overlow(i8 noundef %x_in) {
284 ; CHECK-LABEL: @test_ui_ui_i8_mul_C_fail_overlow(
285 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 14
286 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
287 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xH4CC0
288 ; CHECK-NEXT:    ret half [[R]]
290   %x = and i8 %x_in, 14
291   %xf = uitofp i8 %x to half
292   %r = fmul half %xf, 19.0
293   ret half %r
296 define half @test_si_si_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
297 ; CHECK-LABEL: @test_si_si_i8_mul(
298 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
299 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i8 [[XX]], 1
300 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -8
301 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nsw i8 [[X]], [[Y]]
302 ; CHECK-NEXT:    [[R:%.*]] = sitofp i8 [[TMP1]] to half
303 ; CHECK-NEXT:    ret half [[R]]
305   %xx = and i8 %x_in, 6
306   %x = add nsw nuw i8 %xx, 1
307   %y = or i8 %y_in, -8
308   %xf = sitofp i8 %x to half
309   %yf = sitofp i8 %y to half
310   %r = fmul half %xf, %yf
311   ret half %r
314 define half @test_si_si_i8_mul_fail_maybe_zero(i8 noundef %x_in, i8 noundef %y_in) {
315 ; CHECK-LABEL: @test_si_si_i8_mul_fail_maybe_zero(
316 ; CHECK-NEXT:    [[X:%.*]] = and i8 [[X_IN:%.*]], 7
317 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -8
318 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
319 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i8 [[Y]] to half
320 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
321 ; CHECK-NEXT:    ret half [[R]]
323   %x = and i8 %x_in, 7
324   %y = or i8 %y_in, -8
325   %xf = sitofp i8 %x to half
326   %yf = sitofp i8 %y to half
327   %r = fmul half %xf, %yf
328   ret half %r
331 define half @test_si_si_i8_mul_C_fail_no_repr(i8 noundef %x_in) {
332 ; CHECK-LABEL: @test_si_si_i8_mul_C_fail_no_repr(
333 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
334 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i8 [[XX]], 1
335 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
336 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xHC780
337 ; CHECK-NEXT:    ret half [[R]]
339   %xx = and i8 %x_in, 6
340   %x = add nsw nuw i8 %xx, 1
341   %xf = sitofp i8 %x to half
342   %r = fmul half %xf, -7.5
343   ret half %r
346 define half @test_si_si_i8_mul_C_fail_overflow(i8 noundef %x_in) {
347 ; CHECK-LABEL: @test_si_si_i8_mul_C_fail_overflow(
348 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
349 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i8 [[XX]], 1
350 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
351 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xHCCC0
352 ; CHECK-NEXT:    ret half [[R]]
354   %xx = and i8 %x_in, 6
355   %x = add nsw nuw i8 %xx, 1
356   %xf = sitofp i8 %x to half
357   %r = fmul half %xf, -19.0
358   ret half %r
361 define half @test_ui_si_i8_mul(i8 noundef %x_in, i8 noundef %y_in) {
362 ; CHECK-LABEL: @test_ui_si_i8_mul(
363 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 6
364 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i8 [[XX]], 1
365 ; CHECK-NEXT:    [[YY:%.*]] = and i8 [[Y_IN:%.*]], 7
366 ; CHECK-NEXT:    [[Y:%.*]] = add nuw nsw i8 [[YY]], 1
367 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i8 [[X]], [[Y]]
368 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
369 ; CHECK-NEXT:    ret half [[R]]
371   %xx = and i8 %x_in, 6
372   %x = add i8 %xx, 1
373   %yy = and i8 %y_in, 7
374   %y = add i8 %yy, 1
375   %xf = sitofp i8 %x to half
376   %yf = uitofp i8 %y to half
377   %r = fmul half %xf, %yf
378   ret half %r
381 define half @test_ui_si_i8_mul_fail_maybe_zero(i8 noundef %x_in, i8 noundef %y_in) {
382 ; CHECK-LABEL: @test_ui_si_i8_mul_fail_maybe_zero(
383 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 7
384 ; CHECK-NEXT:    [[X:%.*]] = add nuw nsw i8 [[XX]], 1
385 ; CHECK-NEXT:    [[Y:%.*]] = and i8 [[Y_IN:%.*]], 7
386 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i8 [[X]], [[Y]]
387 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i8 [[TMP1]] to half
388 ; CHECK-NEXT:    ret half [[R]]
390   %xx = and i8 %x_in, 7
391   %x = add i8 %xx, 1
392   %y = and i8 %y_in, 7
393   %xf = sitofp i8 %x to half
394   %yf = uitofp i8 %y to half
395   %r = fmul half %xf, %yf
396   ret half %r
399 define half @test_ui_si_i8_mul_fail_signed(i8 noundef %x_in, i8 noundef %y_in) {
400 ; CHECK-LABEL: @test_ui_si_i8_mul_fail_signed(
401 ; CHECK-NEXT:    [[XX:%.*]] = and i8 [[X_IN:%.*]], 7
402 ; CHECK-NEXT:    [[X:%.*]] = add nuw nsw i8 [[XX]], 1
403 ; CHECK-NEXT:    [[Y:%.*]] = or i8 [[Y_IN:%.*]], -4
404 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i8 [[X]] to half
405 ; CHECK-NEXT:    [[YF:%.*]] = uitofp i8 [[Y]] to half
406 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
407 ; CHECK-NEXT:    ret half [[R]]
409   %xx = and i8 %x_in, 7
410   %x = add i8 %xx, 1
411   %y = or i8 %y_in, -4
412   %xf = sitofp i8 %x to half
413   %yf = uitofp i8 %y to half
414   %r = fmul half %xf, %yf
415   ret half %r
418 define half @test_ui_ui_i16_add(i16 noundef %x_in, i16 noundef %y_in) {
419 ; CHECK-LABEL: @test_ui_ui_i16_add(
420 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
421 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
422 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw nsw i16 [[X]], [[Y]]
423 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i16 [[TMP1]] to half
424 ; CHECK-NEXT:    ret half [[R]]
426   %x = and i16 %x_in, 2047
427   %y = and i16 %y_in, 2047
428   %xf = uitofp i16 %x to half
429   %yf = uitofp i16 %y to half
430   %r = fadd half %xf, %yf
431   ret half %r
434 define half @test_ui_ui_i16_add_fail_not_promotable(i16 noundef %x_in, i16 noundef %y_in) {
435 ; CHECK-LABEL: @test_ui_ui_i16_add_fail_not_promotable(
436 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 2049
437 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
438 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i16 [[X]] to half
439 ; CHECK-NEXT:    [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
440 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
441 ; CHECK-NEXT:    ret half [[R]]
443   %x = and i16 %x_in, 2049
444   %y = and i16 %y_in, 2047
445   %xf = uitofp i16 %x to half
446   %yf = uitofp i16 %y to half
447   %r = fadd half %xf, %yf
448   ret half %r
451 define half @test_ui_ui_i16_add_C(i16 noundef %x_in) {
452 ; CHECK-LABEL: @test_ui_ui_i16_add_C(
453 ; CHECK-NEXT:    [[TMP1:%.*]] = or i16 [[X_IN:%.*]], -2048
454 ; CHECK-NEXT:    [[R:%.*]] = uitofp i16 [[TMP1]] to half
455 ; CHECK-NEXT:    ret half [[R]]
457   %x = and i16 %x_in, 2047
458   %xf = uitofp i16 %x to half
459   %r = fadd half %xf, 63488.0
460   ret half %r
463 define half @test_ui_ui_i16_add_C_fail_overflow(i16 noundef %x_in) {
464 ; CHECK-LABEL: @test_ui_ui_i16_add_C_fail_overflow(
465 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
466 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i16 [[X]] to half
467 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], 0xH7BD0
468 ; CHECK-NEXT:    ret half [[R]]
470   %x = and i16 %x_in, 2047
471   %xf = uitofp i16 %x to half
472   %r = fadd half %xf, 64000.0
473   ret half %r
476 define half @test_si_si_i16_add(i16 noundef %x_in, i16 noundef %y_in) {
477 ; CHECK-LABEL: @test_si_si_i16_add(
478 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
479 ; CHECK-NEXT:    [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2048
480 ; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i16 [[X]], [[Y]]
481 ; CHECK-NEXT:    [[R:%.*]] = sitofp i16 [[TMP1]] to half
482 ; CHECK-NEXT:    ret half [[R]]
484   %x = or i16 %x_in, -2048
485   %y = or i16 %y_in, -2048
486   %xf = sitofp i16 %x to half
487   %yf = sitofp i16 %y to half
488   %r = fadd half %xf, %yf
489   ret half %r
492 define half @test_si_si_i16_add_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
493 ; CHECK-LABEL: @test_si_si_i16_add_fail_no_promotion(
494 ; CHECK-NEXT:    [[XX:%.*]] = or i16 [[X_IN:%.*]], -2048
495 ; CHECK-NEXT:    [[X:%.*]] = add nsw i16 [[XX]], -1
496 ; CHECK-NEXT:    [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2048
497 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i16 [[X]] to half
498 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i16 [[Y]] to half
499 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
500 ; CHECK-NEXT:    ret half [[R]]
502   %xx = or i16 %x_in, -2048
503   %x = sub i16 %xx, 1
504   %y = or i16 %y_in, -2048
505   %xf = sitofp i16 %x to half
506   %yf = sitofp i16 %y to half
507   %r = fadd half %xf, %yf
508   ret half %r
511 define half @test_si_si_i16_add_C_overflow(i16 noundef %x_in) {
512 ; CHECK-LABEL: @test_si_si_i16_add_C_overflow(
513 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
514 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i16 [[X]] to half
515 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], 0xH7840
516 ; CHECK-NEXT:    ret half [[R]]
518   %x = or i16 %x_in, -2048
519   %xf = sitofp i16 %x to half
520   %r = fadd half %xf, 0xH7840
521   ret half %r
524 define half @test_si_si_i16_sub(i16 noundef %x_in, i16 noundef %y_in) {
525 ; CHECK-LABEL: @test_si_si_i16_sub(
526 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
527 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
528 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nuw nsw i16 [[X]], [[Y]]
529 ; CHECK-NEXT:    [[R:%.*]] = sitofp i16 [[TMP1]] to half
530 ; CHECK-NEXT:    ret half [[R]]
532   %x = or i16 %x_in, -2048
533   %y = and i16 %y_in, 2047
534   %xf = sitofp i16 %x to half
535   %yf = sitofp i16 %y to half
536   %r = fsub half %xf, %yf
537   ret half %r
540 define half @test_si_si_i16_sub_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
541 ; CHECK-LABEL: @test_si_si_i16_sub_fail_no_promotion(
542 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
543 ; CHECK-NEXT:    [[Y:%.*]] = or i16 [[Y_IN:%.*]], -2049
544 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i16 [[X]] to half
545 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i16 [[Y]] to half
546 ; CHECK-NEXT:    [[R:%.*]] = fsub half [[XF]], [[YF]]
547 ; CHECK-NEXT:    ret half [[R]]
549   %x = and i16 %x_in, 2047
550   %y = or i16 %y_in, -2049
551   %xf = sitofp i16 %x to half
552   %yf = sitofp i16 %y to half
553   %r = fsub half %xf, %yf
554   ret half %r
557 define half @test_ui_si_i16_sub(i16 noundef %x_in, i16 noundef %y_in) {
558 ; CHECK-LABEL: @test_ui_si_i16_sub(
559 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 2047
560 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
561 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i16 [[X]], [[Y]]
562 ; CHECK-NEXT:    [[R:%.*]] = sitofp i16 [[TMP1]] to half
563 ; CHECK-NEXT:    ret half [[R]]
565   %x = and i16 %x_in, 2047
566   %y = and i16 %y_in, 2047
567   %xf = uitofp i16 %x to half
568   %yf = sitofp i16 %y to half
569   %r = fsub half %xf, %yf
570   ret half %r
573 define half @test_ui_si_i16_sub_fail_maybe_signed(i16 noundef %x_in, i16 noundef %y_in) {
574 ; CHECK-LABEL: @test_ui_si_i16_sub_fail_maybe_signed(
575 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -2048
576 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 2047
577 ; CHECK-NEXT:    [[XF:%.*]] = uitofp i16 [[X]] to half
578 ; CHECK-NEXT:    [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
579 ; CHECK-NEXT:    [[R:%.*]] = fsub half [[XF]], [[YF]]
580 ; CHECK-NEXT:    ret half [[R]]
582   %x = or i16 %x_in, -2048
583   %y = and i16 %y_in, 2047
584   %xf = uitofp i16 %x to half
585   %yf = sitofp i16 %y to half
586   %r = fsub half %xf, %yf
587   ret half %r
590 define half @test_ui_ui_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
591 ; CHECK-LABEL: @test_ui_ui_i16_mul(
592 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 255
593 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 255
594 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw i16 [[X]], [[Y]]
595 ; CHECK-NEXT:    [[R:%.*]] = uitofp i16 [[TMP1]] to half
596 ; CHECK-NEXT:    ret half [[R]]
598   %x = and i16 %x_in, 255
599   %y = and i16 %y_in, 255
600   %xf = uitofp i16 %x to half
601   %yf = uitofp i16 %y to half
602   %r = fmul half %xf, %yf
603   ret half %r
606 define half @test_ui_ui_i16_mul_fail_no_promotion(i16 noundef %x_in, i16 noundef %y_in) {
607 ; CHECK-LABEL: @test_ui_ui_i16_mul_fail_no_promotion(
608 ; CHECK-NEXT:    [[X:%.*]] = and i16 [[X_IN:%.*]], 4095
609 ; CHECK-NEXT:    [[Y:%.*]] = and i16 [[Y_IN:%.*]], 3
610 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i16 [[X]] to half
611 ; CHECK-NEXT:    [[YF:%.*]] = uitofp nneg i16 [[Y]] to half
612 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
613 ; CHECK-NEXT:    ret half [[R]]
615   %x = and i16 %x_in, 4095
616   %y = and i16 %y_in, 3
617   %xf = uitofp i16 %x to half
618   %yf = uitofp i16 %y to half
619   %r = fmul half %xf, %yf
620   ret half %r
623 define half @test_si_si_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
624 ; CHECK-LABEL: @test_si_si_i16_mul(
625 ; CHECK-NEXT:    [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
626 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i16 [[XX]], 1
627 ; CHECK-NEXT:    [[Y:%.*]] = or i16 [[Y_IN:%.*]], -255
628 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nsw i16 [[X]], [[Y]]
629 ; CHECK-NEXT:    [[R:%.*]] = sitofp i16 [[TMP1]] to half
630 ; CHECK-NEXT:    ret half [[R]]
632   %xx = and i16 %x_in, 126
633   %x = add nsw nuw i16 %xx, 1
634   %y = or i16 %y_in, -255
635   %xf = sitofp i16 %x to half
636   %yf = sitofp i16 %y to half
637   %r = fmul half %xf, %yf
638   ret half %r
641 define half @test_si_si_i16_mul_fail_overflow(i16 noundef %x_in, i16 noundef %y_in) {
642 ; CHECK-LABEL: @test_si_si_i16_mul_fail_overflow(
643 ; CHECK-NEXT:    [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
644 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i16 [[XX]], 1
645 ; CHECK-NEXT:    [[Y:%.*]] = or i16 [[Y_IN:%.*]], -257
646 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i16 [[X]] to half
647 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i16 [[Y]] to half
648 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
649 ; CHECK-NEXT:    ret half [[R]]
651   %xx = and i16 %x_in, 126
652   %x = add nsw nuw i16 %xx, 1
653   %y = or i16 %y_in, -257
654   %xf = sitofp i16 %x to half
655   %yf = sitofp i16 %y to half
656   %r = fmul half %xf, %yf
657   ret half %r
660 define half @test_si_si_i16_mul_C_fail_overflow(i16 noundef %x_in) {
661 ; CHECK-LABEL: @test_si_si_i16_mul_C_fail_overflow(
662 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -129
663 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i16 [[X]] to half
664 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xH5800
665 ; CHECK-NEXT:    ret half [[R]]
667   %x = or i16 %x_in, -129
668   %xf = sitofp i16 %x to half
669   %r = fmul half %xf, 128.0
670   ret half %r
673 define half @test_si_si_i16_mul_C_fail_no_promotion(i16 noundef %x_in) {
674 ; CHECK-LABEL: @test_si_si_i16_mul_C_fail_no_promotion(
675 ; CHECK-NEXT:    [[X:%.*]] = or i16 [[X_IN:%.*]], -4097
676 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i16 [[X]] to half
677 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xH4500
678 ; CHECK-NEXT:    ret half [[R]]
680   %x = or i16 %x_in, -4097
681   %xf = sitofp i16 %x to half
682   %r = fmul half %xf, 5.0
683   ret half %r
686 define half @test_ui_si_i16_mul(i16 noundef %x_in, i16 noundef %y_in) {
687 ; CHECK-LABEL: @test_ui_si_i16_mul(
688 ; CHECK-NEXT:    [[XX:%.*]] = and i16 [[X_IN:%.*]], 126
689 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i16 [[XX]], 1
690 ; CHECK-NEXT:    [[YY:%.*]] = and i16 [[Y_IN:%.*]], 126
691 ; CHECK-NEXT:    [[Y:%.*]] = or disjoint i16 [[YY]], 1
692 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i16 [[X]], [[Y]]
693 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i16 [[TMP1]] to half
694 ; CHECK-NEXT:    ret half [[R]]
696   %xx = and i16 %x_in, 126
697   %x = add i16 %xx, 1
698   %yy = and i16 %y_in, 126
699   %y = add i16 %yy, 1
700   %xf = sitofp i16 %x to half
701   %yf = uitofp i16 %y to half
702   %r = fmul half %xf, %yf
703   ret half %r
706 define half @test_ui_ui_i12_add(i12 noundef %x_in, i12 noundef %y_in) {
707 ; CHECK-LABEL: @test_ui_ui_i12_add(
708 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 2047
709 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], 2047
710 ; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i12 [[X]], [[Y]]
711 ; CHECK-NEXT:    [[R:%.*]] = uitofp i12 [[TMP1]] to half
712 ; CHECK-NEXT:    ret half [[R]]
714   %x = and i12 %x_in, 2047
715   %y = and i12 %y_in, 2047
716   %xf = uitofp i12 %x to half
717   %yf = uitofp i12 %y to half
718   %r = fadd half %xf, %yf
719   ret half %r
722 define half @test_ui_ui_i12_add_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
723 ; CHECK-LABEL: @test_ui_ui_i12_add_fail_overflow(
724 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 2047
725 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], -2047
726 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i12 [[X]] to half
727 ; CHECK-NEXT:    [[YF:%.*]] = uitofp i12 [[Y]] to half
728 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
729 ; CHECK-NEXT:    ret half [[R]]
731   %x = and i12 %x_in, 2047
732   %y = and i12 %y_in, 2049
733   %xf = uitofp i12 %x to half
734   %yf = uitofp i12 %y to half
735   %r = fadd half %xf, %yf
736   ret half %r
740 define half @test_si_si_i12_add(i12 noundef %x_in, i12 noundef %y_in) {
741 ; CHECK-LABEL: @test_si_si_i12_add(
742 ; CHECK-NEXT:    [[X:%.*]] = or i12 [[X_IN:%.*]], -1024
743 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1024
744 ; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i12 [[X]], [[Y]]
745 ; CHECK-NEXT:    [[R:%.*]] = sitofp i12 [[TMP1]] to half
746 ; CHECK-NEXT:    ret half [[R]]
748   %x = or i12 %x_in, -1024
749   %y = or i12 %y_in, -1024
750   %xf = sitofp i12 %x to half
751   %yf = sitofp i12 %y to half
752   %r = fadd half %xf, %yf
753   ret half %r
756 define half @test_si_si_i12_add_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
757 ; CHECK-LABEL: @test_si_si_i12_add_fail_overflow(
758 ; CHECK-NEXT:    [[X:%.*]] = or i12 [[X_IN:%.*]], -1025
759 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1025
760 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i12 [[X]] to half
761 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i12 [[Y]] to half
762 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], [[YF]]
763 ; CHECK-NEXT:    ret half [[R]]
765   %x = or i12 %x_in, -1025
766   %y = or i12 %y_in, -1025
767   %xf = sitofp i12 %x to half
768   %yf = sitofp i12 %y to half
769   %r = fadd half %xf, %yf
770   ret half %r
773 define half @test_si_si_i12_add_C_fail_overflow(i12 noundef %x_in) {
774 ; CHECK-LABEL: @test_si_si_i12_add_C_fail_overflow(
775 ; CHECK-NEXT:    [[X:%.*]] = or i12 [[X_IN:%.*]], -2048
776 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i12 [[X]] to half
777 ; CHECK-NEXT:    [[R:%.*]] = fadd half [[XF]], 0xHBC00
778 ; CHECK-NEXT:    ret half [[R]]
780   %x = or i12 %x_in, -2048
781   %xf = sitofp i12 %x to half
782   %r = fadd half %xf, -1.0
783   ret half %r
786 define half @test_ui_ui_i12_sub(i12 noundef %x_in, i12 noundef %y_in) {
787 ; CHECK-LABEL: @test_ui_ui_i12_sub(
788 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
789 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], 1023
790 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
791 ; CHECK-NEXT:    [[R:%.*]] = sitofp i12 [[TMP1]] to half
792 ; CHECK-NEXT:    ret half [[R]]
794   %x = and i12 %x_in, 1023
795   %y = and i12 %y_in, 1023
796   %xf = uitofp i12 %x to half
797   %yf = uitofp i12 %y to half
798   %r = fsub half %xf, %yf
799   ret half %r
802 define half @test_ui_ui_i12_sub_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
803 ; CHECK-LABEL: @test_ui_ui_i12_sub_fail_overflow(
804 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
805 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], 2047
806 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
807 ; CHECK-NEXT:    [[R:%.*]] = sitofp i12 [[TMP1]] to half
808 ; CHECK-NEXT:    ret half [[R]]
810   %x = and i12 %x_in, 1023
811   %y = and i12 %y_in, 2047
812   %xf = uitofp i12 %x to half
813   %yf = uitofp i12 %y to half
814   %r = fsub half %xf, %yf
815   ret half %r
819 define half @test_si_si_i12_sub(i12 noundef %x_in, i12 noundef %y_in) {
820 ; CHECK-LABEL: @test_si_si_i12_sub(
821 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 1023
822 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -1024
823 ; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i12 [[X]], [[Y]]
824 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
825 ; CHECK-NEXT:    ret half [[R]]
827   %x = and i12 %x_in, 1023
828   %y = or i12 %y_in, -1024
829   %xf = sitofp i12 %x to half
830   %yf = sitofp i12 %y to half
831   %r = fsub half %xf, %yf
832   ret half %r
835 define half @test_si_si_i12_sub_fail_overflow(i12 noundef %x, i12 noundef %y) {
836 ; CHECK-LABEL: @test_si_si_i12_sub_fail_overflow(
837 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i12 [[X:%.*]] to half
838 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i12 [[Y:%.*]] to half
839 ; CHECK-NEXT:    [[R:%.*]] = fsub half [[XF]], [[YF]]
840 ; CHECK-NEXT:    ret half [[R]]
842   %xf = sitofp i12 %x to half
843   %yf = sitofp i12 %y to half
844   %r = fsub half %xf, %yf
845   ret half %r
848 define half @test_ui_ui_i12_mul(i12 noundef %x_in, i12 noundef %y_in) {
849 ; CHECK-LABEL: @test_ui_ui_i12_mul(
850 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 31
851 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], 63
852 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i12 [[X]], [[Y]]
853 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
854 ; CHECK-NEXT:    ret half [[R]]
856   %x = and i12 %x_in, 31
857   %y = and i12 %y_in, 63
858   %xf = uitofp i12 %x to half
859   %yf = uitofp i12 %y to half
860   %r = fmul half %xf, %yf
861   ret half %r
864 define half @test_ui_ui_i12_mul_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
865 ; CHECK-LABEL: @test_ui_ui_i12_mul_fail_overflow(
866 ; CHECK-NEXT:    [[XX:%.*]] = and i12 [[X_IN:%.*]], 31
867 ; CHECK-NEXT:    [[X:%.*]] = add nuw nsw i12 [[XX]], 1
868 ; CHECK-NEXT:    [[Y:%.*]] = and i12 [[Y_IN:%.*]], 63
869 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw i12 [[X]], [[Y]]
870 ; CHECK-NEXT:    [[R:%.*]] = uitofp i12 [[TMP1]] to half
871 ; CHECK-NEXT:    ret half [[R]]
873   %xx = and i12 %x_in, 31
874   %x = add i12 %xx, 1
875   %y = and i12 %y_in, 63
876   %xf = uitofp i12 %x to half
877   %yf = uitofp i12 %y to half
878   %r = fmul half %xf, %yf
879   ret half %r
882 define half @test_ui_ui_i12_mul_C(i12 noundef %x_in) {
883 ; CHECK-LABEL: @test_ui_ui_i12_mul_C(
884 ; CHECK-NEXT:    [[X:%.*]] = shl i12 [[X_IN:%.*]], 6
885 ; CHECK-NEXT:    [[TMP1:%.*]] = and i12 [[X]], 1984
886 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
887 ; CHECK-NEXT:    ret half [[R]]
889   %x = and i12 %x_in, 31
890   %xf = uitofp i12 %x to half
891   %r = fmul half %xf, 64.0
892   ret half %r
895 define half @test_si_si_i12_mul(i12 noundef %x_in, i12 noundef %y_in) {
896 ; CHECK-LABEL: @test_si_si_i12_mul(
897 ; CHECK-NEXT:    [[XX:%.*]] = and i12 [[X_IN:%.*]], 30
898 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i12 [[XX]], 1
899 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -64
900 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nsw i12 [[X]], [[Y]]
901 ; CHECK-NEXT:    [[R:%.*]] = sitofp i12 [[TMP1]] to half
902 ; CHECK-NEXT:    ret half [[R]]
904   %xx = and i12 %x_in, 30
905   %x = add nsw nuw i12 %xx, 1
906   %y = or i12 %y_in, -64
907   %xf = sitofp i12 %x to half
908   %yf = sitofp i12 %y to half
909   %r = fmul half %xf, %yf
910   ret half %r
913 define half @test_si_si_i12_mul_fail_overflow(i12 noundef %x_in, i12 noundef %y_in) {
914 ; CHECK-LABEL: @test_si_si_i12_mul_fail_overflow(
915 ; CHECK-NEXT:    [[XX:%.*]] = and i12 [[X_IN:%.*]], 30
916 ; CHECK-NEXT:    [[X:%.*]] = or disjoint i12 [[XX]], 1
917 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -128
918 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i12 [[X]] to half
919 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i12 [[Y]] to half
920 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
921 ; CHECK-NEXT:    ret half [[R]]
923   %xx = and i12 %x_in, 30
924   %x = add nsw nuw i12 %xx, 1
925   %y = or i12 %y_in, -128
926   %xf = sitofp i12 %x to half
927   %yf = sitofp i12 %y to half
928   %r = fmul half %xf, %yf
929   ret half %r
932 define half @test_si_si_i12_mul_fail_maybe_non_zero(i12 noundef %x_in, i12 noundef %y_in) {
933 ; CHECK-LABEL: @test_si_si_i12_mul_fail_maybe_non_zero(
934 ; CHECK-NEXT:    [[X:%.*]] = and i12 [[X_IN:%.*]], 30
935 ; CHECK-NEXT:    [[Y:%.*]] = or i12 [[Y_IN:%.*]], -128
936 ; CHECK-NEXT:    [[XF:%.*]] = uitofp nneg i12 [[X]] to half
937 ; CHECK-NEXT:    [[YF:%.*]] = sitofp i12 [[Y]] to half
938 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], [[YF]]
939 ; CHECK-NEXT:    ret half [[R]]
941   %x = and i12 %x_in, 30
942   %y = or i12 %y_in, -128
943   %xf = sitofp i12 %x to half
944   %yf = sitofp i12 %y to half
945   %r = fmul half %xf, %yf
946   ret half %r
949 define half @test_si_si_i12_mul_C(i12 noundef %x_in) {
950 ; CHECK-LABEL: @test_si_si_i12_mul_C(
951 ; CHECK-NEXT:    [[X:%.*]] = or i12 [[X_IN:%.*]], -64
952 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nsw i12 [[X]], -16
953 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
954 ; CHECK-NEXT:    ret half [[R]]
956   %x = or i12 %x_in, -64
957   %xf = sitofp i12 %x to half
958   %r = fmul half %xf, -16.0
959   ret half %r
962 define half @test_si_si_i12_mul_C_fail_overflow(i12 noundef %x_in) {
963 ; CHECK-LABEL: @test_si_si_i12_mul_C_fail_overflow(
964 ; CHECK-NEXT:    [[X:%.*]] = or i12 [[X_IN:%.*]], -64
965 ; CHECK-NEXT:    [[XF:%.*]] = sitofp i12 [[X]] to half
966 ; CHECK-NEXT:    [[R:%.*]] = fmul half [[XF]], 0xHD400
967 ; CHECK-NEXT:    ret half [[R]]
969   %x = or i12 %x_in, -64
970   %xf = sitofp i12 %x to half
971   %r = fmul half %xf, -64.0
972   ret half %r
975 define half @test_ui_si_i12_mul_nsw(i12 noundef %x_in, i12 noundef %y_in) {
976 ; CHECK-LABEL: @test_ui_si_i12_mul_nsw(
977 ; CHECK-NEXT:    [[XX:%.*]] = and i12 [[X_IN:%.*]], 31
978 ; CHECK-NEXT:    [[X:%.*]] = add nuw nsw i12 [[XX]], 1
979 ; CHECK-NEXT:    [[YY:%.*]] = and i12 [[Y_IN:%.*]], 30
980 ; CHECK-NEXT:    [[Y:%.*]] = or disjoint i12 [[YY]], 1
981 ; CHECK-NEXT:    [[TMP1:%.*]] = mul nuw nsw i12 [[X]], [[Y]]
982 ; CHECK-NEXT:    [[R:%.*]] = uitofp nneg i12 [[TMP1]] to half
983 ; CHECK-NEXT:    ret half [[R]]
985   %xx = and i12 %x_in, 31
986   %x = add i12 %xx, 1
987   %yy = and i12 %y_in, 30
988   %y = add i12 %yy, 1
989   %xf = uitofp i12 %x to half
990   %yf = sitofp i12 %y to half
991   %r = fmul half %xf, %yf
992   ret half %r
995 define float @test_ui_add_with_signed_constant(i32 %shr.i) {
996 ; CHECK-LABEL: @test_ui_add_with_signed_constant(
997 ; CHECK-NEXT:    [[AND_I:%.*]] = and i32 [[SHR_I:%.*]], 32767
998 ; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i32 [[AND_I]], -16383
999 ; CHECK-NEXT:    [[ADD:%.*]] = sitofp i32 [[TMP1]] to float
1000 ; CHECK-NEXT:    ret float [[ADD]]
1002   %and.i = and i32 %shr.i, 32767
1003   %sub = uitofp i32 %and.i to float
1004   %add = fadd float %sub, -16383.0
1005   ret float %add
1009 ;; Reduced form of bug noticed due to #82555
1010 define float @missed_nonzero_check_on_constant_for_si_fmul(i1 %c, i1 %.b, ptr %g_2345) {
1011 ; CHECK-LABEL: @missed_nonzero_check_on_constant_for_si_fmul(
1012 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1013 ; CHECK-NEXT:    [[CONV_I:%.*]] = trunc nuw i32 [[SEL]] to i16
1014 ; CHECK-NEXT:    [[CONV1_I:%.*]] = sitofp i16 [[CONV_I]] to float
1015 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[CONV1_I]])
1016 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1017 ; CHECK-NEXT:    ret float [[MUL3_I_I]]
1019   %sel = select i1 %c, i32 65529, i32 53264
1020   %conv.i = trunc i32 %sel to i16
1021   %conv1.i = sitofp i16 %conv.i to float
1022   %mul3.i.i = fmul float %conv1.i, 0.000000e+00
1023   store i32 %sel, ptr %g_2345, align 4
1024   ret float %mul3.i.i
1027 define <2 x float> @missed_nonzero_check_on_constant_for_si_fmul_vec(i1 %c, i1 %.b, ptr %g_2345) {
1028 ; CHECK-LABEL: @missed_nonzero_check_on_constant_for_si_fmul_vec(
1029 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1030 ; CHECK-NEXT:    [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
1031 ; CHECK-NEXT:    [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
1032 ; CHECK-NEXT:    [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
1033 ; CHECK-NEXT:    [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
1034 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> zeroinitializer, <2 x float> [[CONV1_I]])
1035 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1036 ; CHECK-NEXT:    ret <2 x float> [[MUL3_I_I]]
1038   %sel = select i1 %c, i32 65529, i32 53264
1039   %conv.i.s = trunc i32 %sel to i16
1040   %conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
1041   %conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
1042   %conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
1043   %mul3.i.i = fmul <2 x float> %conv1.i, zeroinitializer
1044   store i32 %sel, ptr %g_2345, align 4
1045   ret <2 x float> %mul3.i.i
1048 define float @negzero_check_on_constant_for_si_fmul(i1 %c, i1 %.b, ptr %g_2345) {
1049 ; CHECK-LABEL: @negzero_check_on_constant_for_si_fmul(
1050 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1051 ; CHECK-NEXT:    [[CONV_I:%.*]] = trunc nuw i32 [[SEL]] to i16
1052 ; CHECK-NEXT:    [[CONV1_I:%.*]] = sitofp i16 [[CONV_I]] to float
1053 ; CHECK-NEXT:    [[TMP1:%.*]] = fneg float [[CONV1_I]]
1054 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = call float @llvm.copysign.f32(float 0.000000e+00, float [[TMP1]])
1055 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1056 ; CHECK-NEXT:    ret float [[MUL3_I_I]]
1058   %sel = select i1 %c, i32 65529, i32 53264
1059   %conv.i = trunc i32 %sel to i16
1060   %conv1.i = sitofp i16 %conv.i to float
1061   %mul3.i.i = fmul float %conv1.i, -0.000000e+00
1062   store i32 %sel, ptr %g_2345, align 4
1063   ret float %mul3.i.i
1066 define <2 x float> @nonzero_check_on_constant_for_si_fmul_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
1067 ; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_vec_w_poison(
1068 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1069 ; CHECK-NEXT:    [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
1070 ; CHECK-NEXT:    [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
1071 ; CHECK-NEXT:    [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
1072 ; CHECK-NEXT:    [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
1073 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> <float poison, float 0.000000e+00>, <2 x float> [[CONV1_I]])
1074 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1075 ; CHECK-NEXT:    ret <2 x float> [[MUL3_I_I]]
1077   %sel = select i1 %c, i32 65529, i32 53264
1078   %conv.i.s = trunc i32 %sel to i16
1079   %conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
1080   %conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
1081   %conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
1082   %mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float 0.000000e+00>
1083   store i32 %sel, ptr %g_2345, align 4
1084   ret <2 x float> %mul3.i.i
1087 define <2 x float> @nonzero_check_on_constant_for_si_fmul_nz_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
1088 ; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_nz_vec_w_poison(
1089 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1090 ; CHECK-NEXT:    [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
1091 ; CHECK-NEXT:    [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
1092 ; CHECK-NEXT:    [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
1093 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
1094 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1095 ; CHECK-NEXT:    ret <2 x float> [[MUL3_I_I]]
1097   %sel = select i1 %c, i32 65529, i32 53264
1098   %conv.i.s = trunc i32 %sel to i16
1099   %conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
1100   %conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
1101   %conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
1102   %mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float 1.000000e+00>
1103   store i32 %sel, ptr %g_2345, align 4
1104   ret <2 x float> %mul3.i.i
1107 define <2 x float> @nonzero_check_on_constant_for_si_fmul_negz_vec_w_poison(i1 %c, i1 %.b, ptr %g_2345) {
1108 ; CHECK-LABEL: @nonzero_check_on_constant_for_si_fmul_negz_vec_w_poison(
1109 ; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[C:%.*]], i32 65529, i32 53264
1110 ; CHECK-NEXT:    [[CONV_I_S:%.*]] = trunc nuw i32 [[SEL]] to i16
1111 ; CHECK-NEXT:    [[CONV_I_V:%.*]] = insertelement <2 x i16> poison, i16 [[CONV_I_S]], i64 0
1112 ; CHECK-NEXT:    [[CONV_I:%.*]] = shufflevector <2 x i16> [[CONV_I_V]], <2 x i16> poison, <2 x i32> zeroinitializer
1113 ; CHECK-NEXT:    [[CONV1_I:%.*]] = sitofp <2 x i16> [[CONV_I]] to <2 x float>
1114 ; CHECK-NEXT:    [[TMP1:%.*]] = fneg <2 x float> [[CONV1_I]]
1115 ; CHECK-NEXT:    [[MUL3_I_I:%.*]] = call <2 x float> @llvm.copysign.v2f32(<2 x float> <float poison, float -0.000000e+00>, <2 x float> [[TMP1]])
1116 ; CHECK-NEXT:    store i32 [[SEL]], ptr [[G_2345:%.*]], align 4
1117 ; CHECK-NEXT:    ret <2 x float> [[MUL3_I_I]]
1119   %sel = select i1 %c, i32 65529, i32 53264
1120   %conv.i.s = trunc i32 %sel to i16
1121   %conv.i.v = insertelement <2 x i16> poison, i16 %conv.i.s, i64 0
1122   %conv.i = insertelement <2 x i16> %conv.i.v, i16 %conv.i.s, i64 1
1123   %conv1.i = sitofp <2 x i16> %conv.i to <2 x float>
1124   %mul3.i.i = fmul <2 x float> %conv1.i, <float poison, float -0.000000e+00>
1125   store i32 %sel, ptr %g_2345, align 4
1126   ret <2 x float> %mul3.i.i