@@ -604,3 +604,127 @@ define <2 x i8> @ashr_known_pos_exact_vec(<2 x i8> %x, <2 x i8> %y) {
604
604
%r = ashr exact <2 x i8 > %p , %y
605
605
ret <2 x i8 > %r
606
606
}
607
+
608
+ define i32 @lshr_mul_times_3_div_2 (i32 %0 ) {
609
+ ; CHECK-LABEL: @lshr_mul_times_3_div_2(
610
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[TMP0:%.*]], 3
611
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[MUL]], 1
612
+ ; CHECK-NEXT: ret i32 [[LSHR]]
613
+ ;
614
+ %mul = mul nsw nuw i32 %0 , 3
615
+ %lshr = lshr i32 %mul , 1
616
+ ret i32 %lshr
617
+ }
618
+
619
+ define i32 @lshr_mul_times_3_div_2_exact (i32 %x ) {
620
+ ; CHECK-LABEL: @lshr_mul_times_3_div_2_exact(
621
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[X:%.*]], 3
622
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr exact i32 [[MUL]], 1
623
+ ; CHECK-NEXT: ret i32 [[LSHR]]
624
+ ;
625
+ %mul = mul nsw i32 %x , 3
626
+ %lshr = lshr exact i32 %mul , 1
627
+ ret i32 %lshr
628
+ }
629
+
630
+ ; Negative test
631
+
632
+ define i32 @lshr_mul_times_3_div_2_no_flags (i32 %0 ) {
633
+ ; CHECK-LABEL: @lshr_mul_times_3_div_2_no_flags(
634
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[TMP0:%.*]], 3
635
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[MUL]], 1
636
+ ; CHECK-NEXT: ret i32 [[LSHR]]
637
+ ;
638
+ %mul = mul i32 %0 , 3
639
+ %lshr = lshr i32 %mul , 1
640
+ ret i32 %lshr
641
+ }
642
+
643
+ ; Negative test
644
+
645
+ define i32 @mul_times_3_div_2_multiuse_lshr (i32 %x ) {
646
+ ; CHECK-LABEL: @mul_times_3_div_2_multiuse_lshr(
647
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[X:%.*]], 3
648
+ ; CHECK-NEXT: [[RES:%.*]] = lshr i32 [[MUL]], 1
649
+ ; CHECK-NEXT: call void @use(i32 [[MUL]])
650
+ ; CHECK-NEXT: ret i32 [[RES]]
651
+ ;
652
+ %mul = mul nuw i32 %x , 3
653
+ %res = lshr i32 %mul , 1
654
+ call void @use (i32 %mul )
655
+ ret i32 %res
656
+ }
657
+
658
+ define i32 @lshr_mul_times_3_div_2_exact_2 (i32 %x ) {
659
+ ; CHECK-LABEL: @lshr_mul_times_3_div_2_exact_2(
660
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[X:%.*]], 3
661
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr exact i32 [[MUL]], 1
662
+ ; CHECK-NEXT: ret i32 [[LSHR]]
663
+ ;
664
+ %mul = mul nuw i32 %x , 3
665
+ %lshr = lshr exact i32 %mul , 1
666
+ ret i32 %lshr
667
+ }
668
+
669
+ define i32 @lshr_mul_times_5_div_4 (i32 %0 ) {
670
+ ; CHECK-LABEL: @lshr_mul_times_5_div_4(
671
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw nsw i32 [[TMP0:%.*]], 5
672
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[MUL]], 2
673
+ ; CHECK-NEXT: ret i32 [[LSHR]]
674
+ ;
675
+ %mul = mul nsw nuw i32 %0 , 5
676
+ %lshr = lshr i32 %mul , 2
677
+ ret i32 %lshr
678
+ }
679
+
680
+ define i32 @lshr_mul_times_5_div_4_exact (i32 %x ) {
681
+ ; CHECK-LABEL: @lshr_mul_times_5_div_4_exact(
682
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[X:%.*]], 5
683
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr exact i32 [[MUL]], 2
684
+ ; CHECK-NEXT: ret i32 [[LSHR]]
685
+ ;
686
+ %mul = mul nsw i32 %x , 5
687
+ %lshr = lshr exact i32 %mul , 2
688
+ ret i32 %lshr
689
+ }
690
+
691
+ ; Negative test
692
+
693
+ define i32 @lshr_mul_times_5_div_4_no_flags (i32 %0 ) {
694
+ ; CHECK-LABEL: @lshr_mul_times_5_div_4_no_flags(
695
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[TMP0:%.*]], 5
696
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr i32 [[MUL]], 2
697
+ ; CHECK-NEXT: ret i32 [[LSHR]]
698
+ ;
699
+ %mul = mul i32 %0 , 5
700
+ %lshr = lshr i32 %mul , 2
701
+ ret i32 %lshr
702
+ }
703
+
704
+ ; Negative test
705
+
706
+ define i32 @mul_times_5_div_4_multiuse_lshr (i32 %x ) {
707
+ ; CHECK-LABEL: @mul_times_5_div_4_multiuse_lshr(
708
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[X:%.*]], 5
709
+ ; CHECK-NEXT: [[RES:%.*]] = lshr i32 [[MUL]], 2
710
+ ; CHECK-NEXT: call void @use(i32 [[MUL]])
711
+ ; CHECK-NEXT: ret i32 [[RES]]
712
+ ;
713
+ %mul = mul nuw i32 %x , 5
714
+ %res = lshr i32 %mul , 2
715
+ call void @use (i32 %mul )
716
+ ret i32 %res
717
+ }
718
+
719
+ define i32 @lshr_mul_times_5_div_4_exact_2 (i32 %x ) {
720
+ ; CHECK-LABEL: @lshr_mul_times_5_div_4_exact_2(
721
+ ; CHECK-NEXT: [[MUL:%.*]] = mul nuw i32 [[X:%.*]], 5
722
+ ; CHECK-NEXT: [[LSHR:%.*]] = lshr exact i32 [[MUL]], 2
723
+ ; CHECK-NEXT: ret i32 [[LSHR]]
724
+ ;
725
+ %mul = mul nuw i32 %x , 5
726
+ %lshr = lshr exact i32 %mul , 2
727
+ ret i32 %lshr
728
+ }
729
+
730
+ declare void @use (i32 )
0 commit comments