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
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
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
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
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
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]]
85 %xf = sitofp i8 %x to half
86 %yf = sitofp i8 %y to half
87 %r = fadd half %xf, %yf
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
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
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
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
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
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
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
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
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
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]]
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
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]]
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
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
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
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
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
308 %xf = sitofp i8 %x to half
309 %yf = sitofp i8 %y to half
310 %r = fmul half %xf, %yf
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]]
325 %xf = sitofp i8 %x to half
326 %yf = sitofp i8 %y to half
327 %r = fmul half %xf, %yf
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
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
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
373 %yy = and i8 %y_in, 7
375 %xf = sitofp i8 %x to half
376 %yf = uitofp i8 %y to half
377 %r = fmul half %xf, %yf
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
393 %xf = sitofp i8 %x to half
394 %yf = uitofp i8 %y to half
395 %r = fmul half %xf, %yf
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
412 %xf = sitofp i8 %x to half
413 %yf = uitofp i8 %y to half
414 %r = fmul half %xf, %yf
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
698 %yy = and i16 %y_in, 126
700 %xf = sitofp i16 %x to half
701 %yf = uitofp i16 %y to half
702 %r = fmul half %xf, %yf
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
987 %yy = and i12 %y_in, 30
989 %xf = uitofp i12 %x to half
990 %yf = sitofp i12 %y to half
991 %r = fmul half %xf, %yf
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
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
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
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