@@ -400,3 +400,214 @@ define i1 @nonzero_reduce_or_fail(<2 x i8> %xx) {
400
400
%r = icmp eq i8 %v , 0
401
401
ret i1 %r
402
402
}
403
+
404
+ define i1 @src_x_add_x_eq_0 (i8 %x ) {
405
+ ; CHECK-LABEL: @src_x_add_x_eq_0(
406
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
407
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
408
+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
409
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
410
+ ; CHECK-NEXT: ret i1 [[R]]
411
+ ;
412
+ %x_eq_0 = icmp eq i8 %x , 0
413
+ %y = zext i1 %x_eq_0 to i8
414
+ %v = add i8 %x , %y
415
+ %r = icmp eq i8 %v , 0
416
+ ret i1 %r
417
+ }
418
+
419
+ define i1 @src_x_add_x_eq_1_fail (i8 %x ) {
420
+ ; CHECK-LABEL: @src_x_add_x_eq_1_fail(
421
+ ; CHECK-NEXT: [[X_EQ_1:%.*]] = icmp eq i8 [[X:%.*]], 1
422
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_1]] to i8
423
+ ; CHECK-NEXT: [[V:%.*]] = add i8 [[X]], [[Y]]
424
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
425
+ ; CHECK-NEXT: ret i1 [[R]]
426
+ ;
427
+ %x_eq_1 = icmp eq i8 %x , 1
428
+ %y = zext i1 %x_eq_1 to i8
429
+ %v = add i8 %x , %y
430
+ %r = icmp eq i8 %v , 0
431
+ ret i1 %r
432
+ }
433
+
434
+ define i1 @src_x_or_x_eq_0 (i8 %x ) {
435
+ ; CHECK-LABEL: @src_x_or_x_eq_0(
436
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
437
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
438
+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
439
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
440
+ ; CHECK-NEXT: ret i1 [[R]]
441
+ ;
442
+ %x_eq_0 = icmp eq i8 %x , 0
443
+ %y = sext i1 %x_eq_0 to i8
444
+ %v = or i8 %x , %y
445
+ %r = icmp eq i8 %v , 0
446
+ ret i1 %r
447
+ }
448
+
449
+ define i1 @src_x_or_x_sle_0_fail (i8 %x ) {
450
+ ; CHECK-LABEL: @src_x_or_x_sle_0_fail(
451
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp sle i8 [[X:%.*]], 0
452
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
453
+ ; CHECK-NEXT: [[V:%.*]] = or i8 [[X]], [[Y]]
454
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
455
+ ; CHECK-NEXT: ret i1 [[R]]
456
+ ;
457
+ %x_eq_0 = icmp sle i8 %x , 0
458
+ %y = sext i1 %x_eq_0 to i8
459
+ %v = or i8 %x , %y
460
+ %r = icmp eq i8 %v , 0
461
+ ret i1 %r
462
+ }
463
+
464
+ define i1 @src_x_xor_x_eq_0 (i8 %x ) {
465
+ ; CHECK-LABEL: @src_x_xor_x_eq_0(
466
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
467
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
468
+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
469
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
470
+ ; CHECK-NEXT: ret i1 [[R]]
471
+ ;
472
+ %x_eq_0 = icmp eq i8 %x , 0
473
+ %y = zext i1 %x_eq_0 to i8
474
+ %v = xor i8 %x , %y
475
+ %r = icmp eq i8 %v , 0
476
+ ret i1 %r
477
+ }
478
+
479
+ define i1 @src_x_xor_x_ne_0_fail (i8 %x ) {
480
+ ; CHECK-LABEL: @src_x_xor_x_ne_0_fail(
481
+ ; CHECK-NEXT: [[X_NE_0:%.*]] = icmp ne i8 [[X:%.*]], 0
482
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_NE_0]] to i8
483
+ ; CHECK-NEXT: [[V:%.*]] = xor i8 [[X]], [[Y]]
484
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
485
+ ; CHECK-NEXT: ret i1 [[R]]
486
+ ;
487
+ %x_ne_0 = icmp ne i8 %x , 0
488
+ %y = zext i1 %x_ne_0 to i8
489
+ %v = xor i8 %x , %y
490
+ %r = icmp eq i8 %v , 0
491
+ ret i1 %r
492
+ }
493
+
494
+ define i1 @src_x_sub0_x_eq_0 (i8 %x ) {
495
+ ; CHECK-LABEL: @src_x_sub0_x_eq_0(
496
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
497
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
498
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X]], [[Y]]
499
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
500
+ ; CHECK-NEXT: ret i1 [[R]]
501
+ ;
502
+ %x_eq_0 = icmp eq i8 %x , 0
503
+ %y = sext i1 %x_eq_0 to i8
504
+ %v = sub i8 %x , %y
505
+ %r = icmp eq i8 %v , 0
506
+ ret i1 %r
507
+ }
508
+
509
+ define i1 @src_x_sub0_z_eq_0_fail (i8 %x , i8 %z ) {
510
+ ; CHECK-LABEL: @src_x_sub0_z_eq_0_fail(
511
+ ; CHECK-NEXT: [[Z_EQ_0:%.*]] = icmp eq i8 [[Z:%.*]], 0
512
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[Z_EQ_0]] to i8
513
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[X:%.*]], [[Y]]
514
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
515
+ ; CHECK-NEXT: ret i1 [[R]]
516
+ ;
517
+ %z_eq_0 = icmp eq i8 %z , 0
518
+ %y = sext i1 %z_eq_0 to i8
519
+ %v = sub i8 %x , %y
520
+ %r = icmp eq i8 %v , 0
521
+ ret i1 %r
522
+ }
523
+
524
+ define i1 @src_x_sub1_x_eq_0 (i8 %x ) {
525
+ ; CHECK-LABEL: @src_x_sub1_x_eq_0(
526
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
527
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
528
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
529
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
530
+ ; CHECK-NEXT: ret i1 [[R]]
531
+ ;
532
+ %x_eq_0 = icmp eq i8 %x , 0
533
+ %y = zext i1 %x_eq_0 to i8
534
+ %v = sub i8 %y , %x
535
+ %r = icmp eq i8 %v , 0
536
+ ret i1 %r
537
+ }
538
+
539
+ define i1 @src_x_sub1_x_eq_0_or_fail (i8 %x , i1 %c1 ) {
540
+ ; CHECK-LABEL: @src_x_sub1_x_eq_0_or_fail(
541
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
542
+ ; CHECK-NEXT: [[X_EQ_0_OR:%.*]] = or i1 [[X_EQ_0]], [[C1:%.*]]
543
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0_OR]] to i8
544
+ ; CHECK-NEXT: [[V:%.*]] = sub i8 [[Y]], [[X]]
545
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
546
+ ; CHECK-NEXT: ret i1 [[R]]
547
+ ;
548
+ %x_eq_0 = icmp eq i8 %x , 0
549
+ %x_eq_0_or = or i1 %x_eq_0 , %c1
550
+ %y = zext i1 %x_eq_0_or to i8
551
+ %v = sub i8 %y , %x
552
+ %r = icmp eq i8 %v , 0
553
+ ret i1 %r
554
+ }
555
+
556
+ define i1 @src_x_umax_x_eq_0 (i8 %x ) {
557
+ ; CHECK-LABEL: @src_x_umax_x_eq_0(
558
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
559
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_EQ_0]] to i8
560
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
561
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
562
+ ; CHECK-NEXT: ret i1 [[R]]
563
+ ;
564
+ %x_eq_0 = icmp eq i8 %x , 0
565
+ %y = sext i1 %x_eq_0 to i8
566
+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
567
+ %r = icmp eq i8 %v , 0
568
+ ret i1 %r
569
+ }
570
+
571
+ define i1 @src_x_umax_x_ugt_10_fail (i8 %x ) {
572
+ ; CHECK-LABEL: @src_x_umax_x_ugt_10_fail(
573
+ ; CHECK-NEXT: [[X_UGT_10:%.*]] = icmp ugt i8 [[X:%.*]], 10
574
+ ; CHECK-NEXT: [[Y:%.*]] = sext i1 [[X_UGT_10]] to i8
575
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.umax.i8(i8 [[Y]], i8 [[X]])
576
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
577
+ ; CHECK-NEXT: ret i1 [[R]]
578
+ ;
579
+ %x_ugt_10 = icmp ugt i8 %x , 10
580
+ %y = sext i1 %x_ugt_10 to i8
581
+ %v = call i8 @llvm.umax.i8 (i8 %y , i8 %x )
582
+ %r = icmp eq i8 %v , 0
583
+ ret i1 %r
584
+ }
585
+
586
+ define i1 @src_x_uadd.sat_x_eq_0 (i8 %x ) {
587
+ ; CHECK-LABEL: @src_x_uadd.sat_x_eq_0(
588
+ ; CHECK-NEXT: [[X_EQ_0:%.*]] = icmp eq i8 [[X:%.*]], 0
589
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[X_EQ_0]] to i8
590
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X]])
591
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
592
+ ; CHECK-NEXT: ret i1 [[R]]
593
+ ;
594
+ %x_eq_0 = icmp eq i8 %x , 0
595
+ %y = zext i1 %x_eq_0 to i8
596
+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
597
+ %r = icmp eq i8 %v , 0
598
+ ret i1 %r
599
+ }
600
+
601
+ define i1 @src_x_uadd.sat_c1_fail (i8 %x , i1 %c1 ) {
602
+ ; CHECK-LABEL: @src_x_uadd.sat_c1_fail(
603
+ ; CHECK-NEXT: [[Y:%.*]] = zext i1 [[C1:%.*]] to i8
604
+ ; CHECK-NEXT: [[V:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[Y]], i8 [[X:%.*]])
605
+ ; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[V]], 0
606
+ ; CHECK-NEXT: ret i1 [[R]]
607
+ ;
608
+ %y = zext i1 %c1 to i8
609
+ %v = call i8 @llvm.uadd.sat.i8 (i8 %y , i8 %x )
610
+ %r = icmp eq i8 %v , 0
611
+ ret i1 %r
612
+ }
613
+
0 commit comments