@@ -3018,6 +3018,40 @@ define i32 @floor_sdiv_wrong_op(i32 %x, i32 %y) {
3018
3018
ret i32 %r
3019
3019
}
3020
3020
3021
+ define i32 @floor_sdiv_using_srem_by_8 (i32 %x ) {
3022
+ ; CHECK-LABEL: @floor_sdiv_using_srem_by_8(
3023
+ ; CHECK-NEXT: [[D:%.*]] = sdiv i32 [[X:%.*]], 8
3024
+ ; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 8
3025
+ ; CHECK-NEXT: [[I:%.*]] = icmp ugt i32 [[R]], -2147483648
3026
+ ; CHECK-NEXT: [[S:%.*]] = sext i1 [[I]] to i32
3027
+ ; CHECK-NEXT: [[F:%.*]] = add nsw i32 [[D]], [[S]]
3028
+ ; CHECK-NEXT: ret i32 [[F]]
3029
+ ;
3030
+ %d = sdiv i32 %x , 8
3031
+ %r = srem i32 %x , 8
3032
+ %i = icmp ugt i32 %r , -2147483648
3033
+ %s = sext i1 %i to i32
3034
+ %f = add i32 %d , %s
3035
+ ret i32 %f
3036
+ }
3037
+
3038
+ define i32 @floor_sdiv_using_srem_by_2 (i32 %x ) {
3039
+ ; CHECK-LABEL: @floor_sdiv_using_srem_by_2(
3040
+ ; CHECK-NEXT: [[D:%.*]] = sdiv i32 [[X:%.*]], 2
3041
+ ; CHECK-NEXT: [[R:%.*]] = srem i32 [[X]], 2
3042
+ ; CHECK-NEXT: [[I:%.*]] = icmp ugt i32 [[R]], -2147483648
3043
+ ; CHECK-NEXT: [[S:%.*]] = sext i1 [[I]] to i32
3044
+ ; CHECK-NEXT: [[F:%.*]] = add nsw i32 [[D]], [[S]]
3045
+ ; CHECK-NEXT: ret i32 [[F]]
3046
+ ;
3047
+ %d = sdiv i32 %x , 2
3048
+ %r = srem i32 %x , 2
3049
+ %i = icmp ugt i32 %r , -2147483648
3050
+ %s = sext i1 %i to i32
3051
+ %f = add i32 %d , %s
3052
+ ret i32 %f
3053
+ }
3054
+
3021
3055
; (X s>> (BW - 1)) + (zext (X s> 0)) --> (X s>> (BW - 1)) | (zext (X != 0))
3022
3056
3023
3057
define i8 @signum_i8_i8 (i8 %x ) {
0 commit comments