@@ -2700,6 +2700,70 @@ define i32 @floor_sdiv(i32 %x) {
27002700 ret i32 %r
27012701}
27022702
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+
27032767; vectors work too and commute is handled by complexity-based canonicalization
27042768
27052769define <2 x i32 > @floor_sdiv_vec_commute (<2 x i32 > %x ) {
0 commit comments