@@ -646,6 +646,71 @@ define i32 @select_or_icmp_bad(i32 %x, i32 %y, i32 %z) {
646
646
ret i32 %C
647
647
}
648
648
649
+ define i32 @select_lshr_icmp_const (i32 %x ) {
650
+ ; CHECK-LABEL: @select_lshr_icmp_const(
651
+ ; CHECK-NEXT: [[A:%.*]] = icmp ugt i32 %x, 31
652
+ ; CHECK-NEXT: [[B:%.*]] = lshr i32 %x, 5
653
+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 0
654
+ ; CHECK-NEXT: ret i32 [[C]]
655
+ ;
656
+ %A = icmp ugt i32 %x , 31
657
+ %B = lshr i32 %x , 5
658
+ %C = select i1 %A , i32 %B , i32 0
659
+ ret i32 %C
660
+ }
661
+
662
+ define i32 @select_lshr_icmp_const_reordered (i32 %x ) {
663
+ ; CHECK-LABEL: @select_lshr_icmp_const_reordered(
664
+ ; CHECK-NEXT: [[A:%.*]] = icmp ult i32 %x, 32
665
+ ; CHECK-NEXT: [[B:%.*]] = lshr i32 %x, 5
666
+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 0, i32 [[B]]
667
+ ; CHECK-NEXT: ret i32 [[C]]
668
+ ;
669
+ %A = icmp ult i32 %x , 32
670
+ %B = lshr i32 %x , 5
671
+ %C = select i1 %A , i32 0 , i32 %B
672
+ ret i32 %C
673
+ }
674
+
675
+ define i32 @select_exact_lshr_icmp_const (i32 %x ) {
676
+ ; CHECK-LABEL: @select_exact_lshr_icmp_const(
677
+ ; CHECK-NEXT: [[A:%.*]] = icmp ugt i32 %x, 31
678
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact i32 %x, 5
679
+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 0
680
+ ; CHECK-NEXT: ret i32 [[C]]
681
+ ;
682
+ %A = icmp ugt i32 %x , 31
683
+ %B = lshr exact i32 %x , 5
684
+ %C = select i1 %A , i32 %B , i32 0
685
+ ret i32 %C
686
+ }
687
+
688
+ define i32 @select_lshr_icmp_const_large_exact_range (i32 %x ) {
689
+ ; CHECK-LABEL: @select_lshr_icmp_const_large_exact_range(
690
+ ; CHECK-NEXT: [[A:%.*]] = icmp ugt i32 %x, 63
691
+ ; CHECK-NEXT: [[B:%.*]] = lshr i32 %x, 5
692
+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 0
693
+ ; CHECK-NEXT: ret i32 [[C]]
694
+ ;
695
+ %A = icmp ugt i32 %x , 63
696
+ %B = lshr i32 %x , 5
697
+ %C = select i1 %A , i32 %B , i32 0
698
+ ret i32 %C
699
+ }
700
+
701
+ define i32 @select_lshr_icmp_const_different_values (i32 %x , i32 %y ) {
702
+ ; CHECK-LABEL: @select_lshr_icmp_const_different_values(
703
+ ; CHECK-NEXT: [[A:%.*]] = icmp ugt i32 %x, 31
704
+ ; CHECK-NEXT: [[B:%.*]] = lshr i32 %y, 5
705
+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], i32 [[B]], i32 0
706
+ ; CHECK-NEXT: ret i32 [[C]]
707
+ ;
708
+ %A = icmp ugt i32 %x , 31
709
+ %B = lshr i32 %y , 5
710
+ %C = select i1 %A , i32 %B , i32 0
711
+ ret i32 %C
712
+ }
713
+
649
714
; Invalid identity constant for FP op
650
715
define float @select_fadd_fcmp_bad (float %x , float %y , float %z ) {
651
716
; CHECK-LABEL: @select_fadd_fcmp_bad(
0 commit comments