@@ -2700,6 +2700,70 @@ define i32 @floor_sdiv(i32 %x) {
2700
2700
ret i32 %r
2701
2701
}
2702
2702
2703
+ define i8 @floor_sdiv_by_2 (i8 %x ) {
2704
+ ; CHECK-LABEL: @floor_sdiv_by_2(
2705
+ ; CHECK-NEXT: [[RV:%.*]] = ashr i8 [[X:%.*]], 1
2706
+ ; CHECK-NEXT: ret i8 [[RV]]
2707
+ ;
2708
+ %div = sdiv i8 %x , 2
2709
+ %and = and i8 %x , -127
2710
+ %icmp = icmp eq i8 %and , -127
2711
+ %sext = sext i1 %icmp to i8
2712
+ %rv = add nsw i8 %div , %sext
2713
+ ret i8 %rv
2714
+ }
2715
+
2716
+ define i8 @floor_sdiv_by_2_wrong_mask (i8 %x ) {
2717
+ ; CHECK-LABEL: @floor_sdiv_by_2_wrong_mask(
2718
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], 2
2719
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], 127
2720
+ ; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i8 [[AND]], 127
2721
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i8
2722
+ ; CHECK-NEXT: [[RV:%.*]] = add nsw i8 [[DIV]], [[SEXT]]
2723
+ ; CHECK-NEXT: ret i8 [[RV]]
2724
+ ;
2725
+ %div = sdiv i8 %x , 2
2726
+ %and = and i8 %x , 127
2727
+ %icmp = icmp eq i8 %and , 127
2728
+ %sext = sext i1 %icmp to i8
2729
+ %rv = add nsw i8 %div , %sext
2730
+ ret i8 %rv
2731
+ }
2732
+
2733
+ define i8 @floor_sdiv_by_2_wrong_constant (i8 %x ) {
2734
+ ; CHECK-LABEL: @floor_sdiv_by_2_wrong_constant(
2735
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], 4
2736
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -125
2737
+ ; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i8 [[AND]], -125
2738
+ ; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i8
2739
+ ; CHECK-NEXT: [[RV:%.*]] = add nsw i8 [[DIV]], [[SEXT]]
2740
+ ; CHECK-NEXT: ret i8 [[RV]]
2741
+ ;
2742
+ %div = sdiv i8 %x , 4
2743
+ %and = and i8 %x , -125
2744
+ %icmp = icmp eq i8 %and , -125
2745
+ %sext = sext i1 %icmp to i8
2746
+ %rv = add nsw i8 %div , %sext
2747
+ ret i8 %rv
2748
+ }
2749
+
2750
+ define i8 @floor_sdiv_by_2_wrong_cast (i8 %x ) {
2751
+ ; CHECK-LABEL: @floor_sdiv_by_2_wrong_cast(
2752
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[X:%.*]], 2
2753
+ ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X]], -127
2754
+ ; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i8 [[AND]], -127
2755
+ ; CHECK-NEXT: [[SEXT:%.*]] = zext i1 [[ICMP]] to i8
2756
+ ; CHECK-NEXT: [[RV:%.*]] = add nsw i8 [[DIV]], [[SEXT]]
2757
+ ; CHECK-NEXT: ret i8 [[RV]]
2758
+ ;
2759
+ %div = sdiv i8 %x , 2
2760
+ %and = and i8 %x , -127
2761
+ %icmp = icmp eq i8 %and , -127
2762
+ %sext = zext i1 %icmp to i8
2763
+ %rv = add nsw i8 %div , %sext
2764
+ ret i8 %rv
2765
+ }
2766
+
2703
2767
; vectors work too and commute is handled by complexity-based canonicalization
2704
2768
2705
2769
define <2 x i32 > @floor_sdiv_vec_commute (<2 x i32 > %x ) {
0 commit comments