@@ -431,3 +431,364 @@ exit:
431
431
432
432
ret i1 %res.9
433
433
}
434
+
435
+ define void @test_or_as_add_ult (i8 %init_val , i8 %high ) {
436
+ ; CHECK-LABEL: @test_or_as_add_ult(
437
+ ; CHECK-NEXT: entry:
438
+ ; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
439
+ ; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
440
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
441
+ ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
442
+ ; CHECK: then:
443
+ ; CHECK-NEXT: [[F_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
444
+ ; CHECK-NEXT: call void @use(i1 [[F_0]])
445
+ ; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
446
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ult i8 [[I_1]], [[HIGH]]
447
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
448
+ ; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
449
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp ult i8 [[I_2]], [[HIGH]]
450
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
451
+ ; CHECK-NEXT: ret void
452
+ ; CHECK: end:
453
+ ; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
454
+ ; CHECK-NEXT: call void @use(i1 true)
455
+ ; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
456
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
457
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
458
+ ; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
459
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
460
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
461
+ ; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
462
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]]
463
+ ; CHECK-NEXT: call void @use(i1 [[T_3]])
464
+ ; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
465
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]
466
+ ; CHECK-NEXT: call void @use(i1 [[C_4]])
467
+ ; CHECK-NEXT: ret void
468
+ ;
469
+ entry:
470
+ %start = shl nuw nsw i8 %init_val , 2
471
+ %start.plus.3 = add nuw i8 %start , 3
472
+ %c.1 = icmp uge i8 %start.plus.3 , %high
473
+ br i1 %c.1 , label %then , label %end
474
+
475
+ then: ; preds = %entry
476
+ %f.0 = icmp ult i8 %start , %high
477
+ call void @use (i1 %f.0 )
478
+ %i.1 = or i8 %start , 1
479
+ %f.1 = icmp ult i8 %i.1 , %high
480
+ call void @use (i1 %f.1 )
481
+ %i.2 = or i8 %start , 2
482
+ %f.2 = icmp ult i8 %i.2 , %high
483
+ call void @use (i1 %f.2 )
484
+ ret void
485
+
486
+ end: ; preds = %entry
487
+ %t.0 = icmp ult i8 %start , %high
488
+ call void @use (i1 %t.0 )
489
+ %start.1 = or i8 %start , 1
490
+ %t.1 = icmp ult i8 %start.1 , %high
491
+ call void @use (i1 %t.1 )
492
+ %start.2 = or i8 %start , 2
493
+ %t.2 = icmp ult i8 %start.2 , %high
494
+ call void @use (i1 %t.2 )
495
+ %start.3 = or i8 %start , 3
496
+ %t.3 = icmp ult i8 %start.3 , %high
497
+ call void @use (i1 %t.3 )
498
+ %start.4 = or i8 %start , 4
499
+ %c.4 = icmp ult i8 %start.4 , %high
500
+ call void @use (i1 %c.4 )
501
+ ret void
502
+ }
503
+
504
+ define void @test_or_as_add_ule (i8 %init_val , i8 %high ) {
505
+ ; CHECK-LABEL: @test_or_as_add_ule(
506
+ ; CHECK-NEXT: entry:
507
+ ; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
508
+ ; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
509
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
510
+ ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
511
+ ; CHECK: then:
512
+ ; CHECK-NEXT: [[F_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
513
+ ; CHECK-NEXT: call void @use(i1 [[F_0]])
514
+ ; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
515
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[I_1]], [[HIGH]]
516
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
517
+ ; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
518
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp ule i8 [[I_2]], [[HIGH]]
519
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
520
+ ; CHECK-NEXT: ret void
521
+ ; CHECK: end:
522
+ ; CHECK-NEXT: [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
523
+ ; CHECK-NEXT: call void @use(i1 true)
524
+ ; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
525
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]]
526
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
527
+ ; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
528
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8 [[START_2]], [[HIGH]]
529
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
530
+ ; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
531
+ ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_3]], [[HIGH]]
532
+ ; CHECK-NEXT: call void @use(i1 [[T_3]])
533
+ ; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
534
+ ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_4]], [[HIGH]]
535
+ ; CHECK-NEXT: call void @use(i1 [[T_4]])
536
+ ; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
537
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]]
538
+ ; CHECK-NEXT: call void @use(i1 [[C_5]])
539
+ ; CHECK-NEXT: ret void
540
+ ;
541
+ entry:
542
+ %start = shl nuw nsw i8 %init_val , 2
543
+ %start.plus.3 = add nuw i8 %start , 3
544
+ %c.1 = icmp uge i8 %start.plus.3 , %high
545
+ br i1 %c.1 , label %then , label %end
546
+
547
+ then: ; preds = %entry
548
+ %f.0 = icmp ule i8 %start , %high
549
+ call void @use (i1 %f.0 )
550
+ %i.1 = or i8 %start , 1
551
+ %f.1 = icmp ule i8 %i.1 , %high
552
+ call void @use (i1 %f.1 )
553
+ %i.2 = or i8 %start , 2
554
+ %f.2 = icmp ule i8 %i.2 , %high
555
+ call void @use (i1 %f.2 )
556
+ ret void
557
+
558
+ end: ; preds = %entry
559
+ %t.0 = icmp ule i8 %start , %high
560
+ call void @use (i1 %t.0 )
561
+ %start.1 = or i8 %start , 1
562
+ %t.1 = icmp ule i8 %start.1 , %high
563
+ call void @use (i1 %t.1 )
564
+ %start.2 = or i8 %start , 2
565
+ %t.2 = icmp ule i8 %start.2 , %high
566
+ call void @use (i1 %t.2 )
567
+ %start.3 = or i8 %start , 3
568
+ %t.3 = icmp ule i8 %start.3 , %high
569
+ call void @use (i1 %t.3 )
570
+ %start.4 = or i8 %start , 4
571
+ %t.4 = icmp ule i8 %start.4 , %high
572
+ call void @use (i1 %t.4 )
573
+ %start.5 = or i8 %start , 5
574
+ %c.5 = icmp ule i8 %start.5 , %high
575
+ call void @use (i1 %c.5 )
576
+
577
+ ret void
578
+ }
579
+
580
+ define void @test_or_as_add_ugt (i8 %init_val , i8 %high ) {
581
+ ; CHECK-LABEL: @test_or_as_add_ugt(
582
+ ; CHECK-NEXT: entry:
583
+ ; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
584
+ ; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
585
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
586
+ ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
587
+ ; CHECK: then:
588
+ ; CHECK-NEXT: [[T_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
589
+ ; CHECK-NEXT: call void @use(i1 [[T_0]])
590
+ ; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
591
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[I_1]], [[HIGH]]
592
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
593
+ ; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
594
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp ugt i8 [[I_2]], [[HIGH]]
595
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
596
+ ; CHECK-NEXT: ret void
597
+ ; CHECK: end:
598
+ ; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
599
+ ; CHECK-NEXT: call void @use(i1 false)
600
+ ; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
601
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]]
602
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
603
+ ; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
604
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8 [[START_2]], [[HIGH]]
605
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
606
+ ; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
607
+ ; CHECK-NEXT: [[F_3:%.*]] = icmp ugt i8 [[START_3]], [[HIGH]]
608
+ ; CHECK-NEXT: call void @use(i1 [[F_3]])
609
+ ; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
610
+ ; CHECK-NEXT: [[F_4:%.*]] = icmp ugt i8 [[START_4]], [[HIGH]]
611
+ ; CHECK-NEXT: call void @use(i1 [[F_4]])
612
+ ; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
613
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]]
614
+ ; CHECK-NEXT: call void @use(i1 [[C_5]])
615
+ ; CHECK-NEXT: ret void
616
+ ;
617
+ entry:
618
+ %start = shl nuw nsw i8 %init_val , 2
619
+ %start.plus.3 = add nuw i8 %start , 3
620
+ %c.1 = icmp uge i8 %start.plus.3 , %high
621
+ br i1 %c.1 , label %then , label %end
622
+
623
+ then: ; preds = %entry
624
+ %t.0 = icmp ugt i8 %start , %high
625
+ call void @use (i1 %t.0 )
626
+ %i.1 = or i8 %start , 1
627
+ %t.1 = icmp ugt i8 %i.1 , %high
628
+ call void @use (i1 %t.1 )
629
+ %i.2 = or i8 %start , 2
630
+ %t.2 = icmp ugt i8 %i.2 , %high
631
+ call void @use (i1 %t.2 )
632
+ ret void
633
+
634
+ end: ; preds = %entry
635
+ %f.0 = icmp ugt i8 %start , %high
636
+ call void @use (i1 %f.0 )
637
+ %start.1 = or i8 %start , 1
638
+ %f.1 = icmp ugt i8 %start.1 , %high
639
+ call void @use (i1 %f.1 )
640
+ %start.2 = or i8 %start , 2
641
+ %f.2 = icmp ugt i8 %start.2 , %high
642
+ call void @use (i1 %f.2 )
643
+ %start.3 = or i8 %start , 3
644
+ %f.3 = icmp ugt i8 %start.3 , %high
645
+ call void @use (i1 %f.3 )
646
+ %start.4 = or i8 %start , 4
647
+ %f.4 = icmp ugt i8 %start.4 , %high
648
+ call void @use (i1 %f.4 )
649
+ %start.5 = or i8 %start , 5
650
+ %c.5 = icmp ugt i8 %start.5 , %high
651
+ call void @use (i1 %c.5 )
652
+ ret void
653
+ }
654
+
655
+ define void @test_or_as_add_uge (i8 %init_val , i8 %high ) {
656
+ ; CHECK-LABEL: @test_or_as_add_uge(
657
+ ; CHECK-NEXT: entry:
658
+ ; CHECK-NEXT: [[START:%.*]] = shl nuw nsw i8 [[INIT_VAL:%.*]], 2
659
+ ; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START]], 3
660
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
661
+ ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
662
+ ; CHECK: then:
663
+ ; CHECK-NEXT: [[T_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
664
+ ; CHECK-NEXT: call void @use(i1 [[T_0]])
665
+ ; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
666
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[I_1]], [[HIGH]]
667
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
668
+ ; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
669
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp uge i8 [[I_2]], [[HIGH]]
670
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
671
+ ; CHECK-NEXT: ret void
672
+ ; CHECK: end:
673
+ ; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
674
+ ; CHECK-NEXT: call void @use(i1 false)
675
+ ; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
676
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
677
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
678
+ ; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
679
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
680
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
681
+ ; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
682
+ ; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
683
+ ; CHECK-NEXT: call void @use(i1 [[F_3]])
684
+ ; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
685
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
686
+ ; CHECK-NEXT: call void @use(i1 [[C_4]])
687
+ ; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
688
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
689
+ ; CHECK-NEXT: call void @use(i1 [[C_5]])
690
+ ; CHECK-NEXT: ret void
691
+ ;
692
+ entry:
693
+ %start = shl nuw nsw i8 %init_val , 2
694
+ %start.plus.3 = add nuw i8 %start , 3
695
+ %c.1 = icmp uge i8 %start.plus.3 , %high
696
+ br i1 %c.1 , label %then , label %end
697
+
698
+ then: ; preds = %entry
699
+ %t.0 = icmp ugt i8 %start , %high
700
+ call void @use (i1 %t.0 )
701
+ %i.1 = or i8 %start , 1
702
+ %t.1 = icmp uge i8 %i.1 , %high
703
+ call void @use (i1 %t.1 )
704
+ %i.2 = or i8 %start , 2
705
+ %t.2 = icmp uge i8 %i.2 , %high
706
+ call void @use (i1 %t.2 )
707
+ ret void
708
+
709
+ end: ; preds = %entry
710
+ %f.0 = icmp ugt i8 %start , %high
711
+ call void @use (i1 %f.0 )
712
+ %start.1 = or i8 %start , 1
713
+ %f.1 = icmp uge i8 %start.1 , %high
714
+ call void @use (i1 %f.1 )
715
+ %start.2 = or i8 %start , 2
716
+ %f.2 = icmp uge i8 %start.2 , %high
717
+ call void @use (i1 %f.2 )
718
+ %start.3 = or i8 %start , 3
719
+ %f.3 = icmp uge i8 %start.3 , %high
720
+ call void @use (i1 %f.3 )
721
+ %start.4 = or i8 %start , 4
722
+ %c.4 = icmp uge i8 %start.4 , %high
723
+ call void @use (i1 %c.4 )
724
+ %start.5 = or i8 %start , 5
725
+ %c.5 = icmp uge i8 %start.5 , %high
726
+ call void @use (i1 %c.5 )
727
+ ret void
728
+ }
729
+
730
+ define void @test_not_decompose (i8 %start , i8 %high ) {
731
+ ; CHECK-LABEL: @test_not_decompose(
732
+ ; CHECK-NEXT: entry:
733
+ ; CHECK-NEXT: [[START_PLUS_3:%.*]] = add nuw i8 [[START:%.*]], 3
734
+ ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[START_PLUS_3]], [[HIGH:%.*]]
735
+ ; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[END:%.*]]
736
+ ; CHECK: then:
737
+ ; CHECK-NEXT: [[I_1:%.*]] = or i8 [[START]], 1
738
+ ; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[I_1]], [[HIGH]]
739
+ ; CHECK-NEXT: call void @use(i1 [[T_1]])
740
+ ; CHECK-NEXT: [[I_2:%.*]] = or i8 [[START]], 2
741
+ ; CHECK-NEXT: [[T_2:%.*]] = icmp uge i8 [[I_2]], [[HIGH]]
742
+ ; CHECK-NEXT: call void @use(i1 [[T_2]])
743
+ ; CHECK-NEXT: ret void
744
+ ; CHECK: end:
745
+ ; CHECK-NEXT: [[START_1:%.*]] = or i8 [[START]], 1
746
+ ; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
747
+ ; CHECK-NEXT: call void @use(i1 [[F_1]])
748
+ ; CHECK-NEXT: [[START_2:%.*]] = or i8 [[START]], 2
749
+ ; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
750
+ ; CHECK-NEXT: call void @use(i1 [[F_2]])
751
+ ; CHECK-NEXT: [[START_3:%.*]] = or i8 [[START]], 3
752
+ ; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
753
+ ; CHECK-NEXT: call void @use(i1 [[F_3]])
754
+ ; CHECK-NEXT: [[START_4:%.*]] = or i8 [[START]], 4
755
+ ; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
756
+ ; CHECK-NEXT: call void @use(i1 [[C_4]])
757
+ ; CHECK-NEXT: [[START_5:%.*]] = or i8 [[START]], 5
758
+ ; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
759
+ ; CHECK-NEXT: call void @use(i1 [[C_5]])
760
+ ; CHECK-NEXT: ret void
761
+ ;
762
+ entry:
763
+ %start.plus.3 = add nuw i8 %start , 3
764
+ %c.1 = icmp uge i8 %start.plus.3 , %high
765
+ br i1 %c.1 , label %then , label %end
766
+
767
+ then: ; preds = %entry
768
+ %i.1 = or i8 %start , 1
769
+ %t.1 = icmp uge i8 %i.1 , %high
770
+ call void @use (i1 %t.1 )
771
+ %i.2 = or i8 %start , 2
772
+ %t.2 = icmp uge i8 %i.2 , %high
773
+ call void @use (i1 %t.2 )
774
+ ret void
775
+
776
+ end: ; preds = %entry
777
+ %start.1 = or i8 %start , 1
778
+ %f.1 = icmp uge i8 %start.1 , %high
779
+ call void @use (i1 %f.1 )
780
+ %start.2 = or i8 %start , 2
781
+ %f.2 = icmp uge i8 %start.2 , %high
782
+ call void @use (i1 %f.2 )
783
+ %start.3 = or i8 %start , 3
784
+ %f.3 = icmp uge i8 %start.3 , %high
785
+ call void @use (i1 %f.3 )
786
+ %start.4 = or i8 %start , 4
787
+ %c.4 = icmp uge i8 %start.4 , %high
788
+ call void @use (i1 %c.4 )
789
+ %start.5 = or i8 %start , 5
790
+ %c.5 = icmp uge i8 %start.5 , %high
791
+ call void @use (i1 %c.5 )
792
+
793
+ ret void
794
+ }
0 commit comments