@@ -268,3 +268,328 @@ define i1 @icmp_trunc_x_zext_y_fail_multiuse(i32 %x, i8 %y) {
268
268
%r = icmp ule i16 %x16 , %y16
269
269
ret i1 %r
270
270
}
271
+
272
+ define i1 @trunc_unsigned_nuw (i16 %x , i16 %y ) {
273
+ ; CHECK-LABEL: @trunc_unsigned_nuw(
274
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
275
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
276
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
277
+ ; CHECK-NEXT: ret i1 [[C]]
278
+ ;
279
+ %xt = trunc nuw i16 %x to i8
280
+ %yt = trunc nuw i16 %y to i8
281
+ %c = icmp ult i8 %xt , %yt
282
+ ret i1 %c
283
+ }
284
+
285
+ define i1 @trunc_unsigned_nsw (i16 %x , i16 %y ) {
286
+ ; CHECK-LABEL: @trunc_unsigned_nsw(
287
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
288
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
289
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
290
+ ; CHECK-NEXT: ret i1 [[C]]
291
+ ;
292
+ %xt = trunc nsw i16 %x to i8
293
+ %yt = trunc nsw i16 %y to i8
294
+ %c = icmp ult i8 %xt , %yt
295
+ ret i1 %c
296
+ }
297
+
298
+ define i1 @trunc_unsigned_both (i16 %x , i16 %y ) {
299
+ ; CHECK-LABEL: @trunc_unsigned_both(
300
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
301
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
302
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
303
+ ; CHECK-NEXT: ret i1 [[C]]
304
+ ;
305
+ %xt = trunc nuw nsw i16 %x to i8
306
+ %yt = trunc nuw nsw i16 %y to i8
307
+ %c = icmp ult i8 %xt , %yt
308
+ ret i1 %c
309
+ }
310
+
311
+ define i1 @trunc_unsigned_either (i16 %x , i16 %y ) {
312
+ ; CHECK-LABEL: @trunc_unsigned_either(
313
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
314
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
315
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[XT]], [[YT]]
316
+ ; CHECK-NEXT: ret i1 [[C]]
317
+ ;
318
+ %xt = trunc nuw i16 %x to i8
319
+ %yt = trunc nsw i16 %y to i8
320
+ %c = icmp ult i8 %xt , %yt
321
+ ret i1 %c
322
+ }
323
+
324
+ define i1 @trunc_signed_nuw (i16 %x , i16 %y ) {
325
+ ; CHECK-LABEL: @trunc_signed_nuw(
326
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
327
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
328
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
329
+ ; CHECK-NEXT: ret i1 [[C]]
330
+ ;
331
+ %xt = trunc nuw i16 %x to i8
332
+ %yt = trunc nuw i16 %y to i8
333
+ %c = icmp slt i8 %xt , %yt
334
+ ret i1 %c
335
+ }
336
+
337
+ define i1 @trunc_signed_nsw (i16 %x , i16 %y ) {
338
+ ; CHECK-LABEL: @trunc_signed_nsw(
339
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
340
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
341
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
342
+ ; CHECK-NEXT: ret i1 [[C]]
343
+ ;
344
+ %xt = trunc nsw i16 %x to i8
345
+ %yt = trunc nsw i16 %y to i8
346
+ %c = icmp slt i8 %xt , %yt
347
+ ret i1 %c
348
+ }
349
+
350
+ define i1 @trunc_signed_both (i16 %x , i16 %y ) {
351
+ ; CHECK-LABEL: @trunc_signed_both(
352
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
353
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
354
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
355
+ ; CHECK-NEXT: ret i1 [[C]]
356
+ ;
357
+ %xt = trunc nuw nsw i16 %x to i8
358
+ %yt = trunc nuw nsw i16 %y to i8
359
+ %c = icmp slt i8 %xt , %yt
360
+ ret i1 %c
361
+ }
362
+
363
+ define i1 @trunc_signed_either (i16 %x , i16 %y ) {
364
+ ; CHECK-LABEL: @trunc_signed_either(
365
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
366
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
367
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i8 [[XT]], [[YT]]
368
+ ; CHECK-NEXT: ret i1 [[C]]
369
+ ;
370
+ %xt = trunc nuw i16 %x to i8
371
+ %yt = trunc nsw i16 %y to i8
372
+ %c = icmp slt i8 %xt , %yt
373
+ ret i1 %c
374
+ }
375
+
376
+ define i1 @trunc_equality_nuw (i16 %x , i16 %y ) {
377
+ ; CHECK-LABEL: @trunc_equality_nuw(
378
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
379
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw i16 [[Y:%.*]] to i8
380
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
381
+ ; CHECK-NEXT: ret i1 [[C]]
382
+ ;
383
+ %xt = trunc nuw i16 %x to i8
384
+ %yt = trunc nuw i16 %y to i8
385
+ %c = icmp eq i8 %xt , %yt
386
+ ret i1 %c
387
+ }
388
+
389
+ define i1 @trunc_equality_nsw (i16 %x , i16 %y ) {
390
+ ; CHECK-LABEL: @trunc_equality_nsw(
391
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i16 [[X:%.*]] to i8
392
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
393
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
394
+ ; CHECK-NEXT: ret i1 [[C]]
395
+ ;
396
+ %xt = trunc nsw i16 %x to i8
397
+ %yt = trunc nsw i16 %y to i8
398
+ %c = icmp eq i8 %xt , %yt
399
+ ret i1 %c
400
+ }
401
+
402
+ define i1 @trunc_equality_both (i16 %x , i16 %y ) {
403
+ ; CHECK-LABEL: @trunc_equality_both(
404
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i16 [[X:%.*]] to i8
405
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nuw nsw i16 [[Y:%.*]] to i8
406
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
407
+ ; CHECK-NEXT: ret i1 [[C]]
408
+ ;
409
+ %xt = trunc nuw nsw i16 %x to i8
410
+ %yt = trunc nuw nsw i16 %y to i8
411
+ %c = icmp eq i8 %xt , %yt
412
+ ret i1 %c
413
+ }
414
+
415
+ define i1 @trunc_equality_either (i16 %x , i16 %y ) {
416
+ ; CHECK-LABEL: @trunc_equality_either(
417
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i16 [[X:%.*]] to i8
418
+ ; CHECK-NEXT: [[YT:%.*]] = trunc nsw i16 [[Y:%.*]] to i8
419
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[XT]], [[YT]]
420
+ ; CHECK-NEXT: ret i1 [[C]]
421
+ ;
422
+ %xt = trunc nuw i16 %x to i8
423
+ %yt = trunc nsw i16 %y to i8
424
+ %c = icmp eq i8 %xt , %yt
425
+ ret i1 %c
426
+ }
427
+
428
+ define i1 @trunc_unsigned_nuw_zext (i32 %x , i8 %y ) {
429
+ ; CHECK-LABEL: @trunc_unsigned_nuw_zext(
430
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
431
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
432
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
433
+ ; CHECK-NEXT: ret i1 [[C]]
434
+ ;
435
+ %xt = trunc nuw i32 %x to i16
436
+ %ye = zext i8 %y to i16
437
+ %c = icmp ult i16 %xt , %ye
438
+ ret i1 %c
439
+ }
440
+
441
+ define i1 @trunc_unsigned_nuw_sext (i32 %x , i8 %y ) {
442
+ ; CHECK-LABEL: @trunc_unsigned_nuw_sext(
443
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
444
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
445
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
446
+ ; CHECK-NEXT: ret i1 [[C]]
447
+ ;
448
+ %xt = trunc nuw i32 %x to i16
449
+ %ye = sext i8 %y to i16
450
+ %c = icmp ult i16 %xt , %ye
451
+ ret i1 %c
452
+ }
453
+
454
+ define i1 @trunc_unsigned_nsw_zext (i32 %x , i8 %y ) {
455
+ ; CHECK-LABEL: @trunc_unsigned_nsw_zext(
456
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
457
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
458
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
459
+ ; CHECK-NEXT: ret i1 [[C]]
460
+ ;
461
+ %xt = trunc nsw i32 %x to i16
462
+ %ye = zext i8 %y to i16
463
+ %c = icmp ult i16 %xt , %ye
464
+ ret i1 %c
465
+ }
466
+
467
+ define i1 @trunc_unsigned_nsw_sext (i32 %x , i8 %y ) {
468
+ ; CHECK-LABEL: @trunc_unsigned_nsw_sext(
469
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
470
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
471
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i16 [[XT]], [[YE]]
472
+ ; CHECK-NEXT: ret i1 [[C]]
473
+ ;
474
+ %xt = trunc nsw i32 %x to i16
475
+ %ye = sext i8 %y to i16
476
+ %c = icmp ult i16 %xt , %ye
477
+ ret i1 %c
478
+ }
479
+
480
+ define i1 @trunc_signed_nsw_sext (i32 %x , i8 %y ) {
481
+ ; CHECK-LABEL: @trunc_signed_nsw_sext(
482
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
483
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
484
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
485
+ ; CHECK-NEXT: ret i1 [[C]]
486
+ ;
487
+ %xt = trunc nsw i32 %x to i16
488
+ %ye = sext i8 %y to i16
489
+ %c = icmp slt i16 %xt , %ye
490
+ ret i1 %c
491
+ }
492
+
493
+ define i1 @trunc_signed_nsw_zext (i32 %x , i8 %y ) {
494
+ ; CHECK-LABEL: @trunc_signed_nsw_zext(
495
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
496
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
497
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
498
+ ; CHECK-NEXT: ret i1 [[C]]
499
+ ;
500
+ %xt = trunc nsw i32 %x to i16
501
+ %ye = zext i8 %y to i16
502
+ %c = icmp slt i16 %xt , %ye
503
+ ret i1 %c
504
+ }
505
+
506
+ define i1 @trunc_signed_nuw_sext (i32 %x , i8 %y ) {
507
+ ; CHECK-LABEL: @trunc_signed_nuw_sext(
508
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
509
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
510
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
511
+ ; CHECK-NEXT: ret i1 [[C]]
512
+ ;
513
+ %xt = trunc nuw i32 %x to i16
514
+ %ye = sext i8 %y to i16
515
+ %c = icmp slt i16 %xt , %ye
516
+ ret i1 %c
517
+ }
518
+
519
+ define i1 @trunc_signed_nuw_zext (i32 %x , i8 %y ) {
520
+ ; CHECK-LABEL: @trunc_signed_nuw_zext(
521
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
522
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
523
+ ; CHECK-NEXT: [[C:%.*]] = icmp slt i16 [[XT]], [[YE]]
524
+ ; CHECK-NEXT: ret i1 [[C]]
525
+ ;
526
+ %xt = trunc nuw i32 %x to i16
527
+ %ye = zext i8 %y to i16
528
+ %c = icmp slt i16 %xt , %ye
529
+ ret i1 %c
530
+ }
531
+
532
+ define i1 @trunc_equality_nuw_zext (i32 %x , i8 %y ) {
533
+ ; CHECK-LABEL: @trunc_equality_nuw_zext(
534
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
535
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
536
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
537
+ ; CHECK-NEXT: ret i1 [[C]]
538
+ ;
539
+ %xt = trunc nuw i32 %x to i16
540
+ %ye = zext i8 %y to i16
541
+ %c = icmp ne i16 %xt , %ye
542
+ ret i1 %c
543
+ }
544
+
545
+ define i1 @trunc_equality_nuw_sext (i32 %x , i8 %y ) {
546
+ ; CHECK-LABEL: @trunc_equality_nuw_sext(
547
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw i32 [[X:%.*]] to i16
548
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
549
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
550
+ ; CHECK-NEXT: ret i1 [[C]]
551
+ ;
552
+ %xt = trunc nuw i32 %x to i16
553
+ %ye = sext i8 %y to i16
554
+ %c = icmp ne i16 %xt , %ye
555
+ ret i1 %c
556
+ }
557
+
558
+ define i1 @trunc_equality_nsw_zext (i32 %x , i8 %y ) {
559
+ ; CHECK-LABEL: @trunc_equality_nsw_zext(
560
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
561
+ ; CHECK-NEXT: [[YE:%.*]] = zext i8 [[Y:%.*]] to i16
562
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
563
+ ; CHECK-NEXT: ret i1 [[C]]
564
+ ;
565
+ %xt = trunc nsw i32 %x to i16
566
+ %ye = zext i8 %y to i16
567
+ %c = icmp ne i16 %xt , %ye
568
+ ret i1 %c
569
+ }
570
+
571
+ define i1 @trunc_equality_nsw_sext (i32 %x , i8 %y ) {
572
+ ; CHECK-LABEL: @trunc_equality_nsw_sext(
573
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nsw i32 [[X:%.*]] to i16
574
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
575
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
576
+ ; CHECK-NEXT: ret i1 [[C]]
577
+ ;
578
+ %xt = trunc nsw i32 %x to i16
579
+ %ye = sext i8 %y to i16
580
+ %c = icmp ne i16 %xt , %ye
581
+ ret i1 %c
582
+ }
583
+
584
+ define i1 @trunc_equality_both_sext (i32 %x , i8 %y ) {
585
+ ; CHECK-LABEL: @trunc_equality_both_sext(
586
+ ; CHECK-NEXT: [[XT:%.*]] = trunc nuw nsw i32 [[X:%.*]] to i16
587
+ ; CHECK-NEXT: [[YE:%.*]] = sext i8 [[Y:%.*]] to i16
588
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[XT]], [[YE]]
589
+ ; CHECK-NEXT: ret i1 [[C]]
590
+ ;
591
+ %xt = trunc nuw nsw i32 %x to i16
592
+ %ye = sext i8 %y to i16
593
+ %c = icmp ne i16 %xt , %ye
594
+ ret i1 %c
595
+ }
0 commit comments