@@ -3023,4 +3023,82 @@ define i1 @icmp_addnuw_nonzero_fail_multiuse(i32 %x, i32 %y) {
3023
3023
ret i1 %c
3024
3024
}
3025
3025
3026
+ define i1 @ult_add_C2_pow2_C_neg (i8 %x ) {
3027
+ ; CHECK-LABEL: @ult_add_C2_pow2_C_neg(
3028
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -32
3029
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[TMP1]], -64
3030
+ ; CHECK-NEXT: ret i1 [[C]]
3031
+ ;
3032
+ %i = add i8 %x , 32
3033
+ %c = icmp ult i8 %i , -32
3034
+ ret i1 %c
3035
+ }
3036
+
3037
+ define i1 @ult_add_nsw_C2_pow2_C_neg (i8 %x ) {
3038
+ ; CHECK-LABEL: @ult_add_nsw_C2_pow2_C_neg(
3039
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -32
3040
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne i8 [[TMP1]], -64
3041
+ ; CHECK-NEXT: ret i1 [[C]]
3042
+ ;
3043
+ %i = add nsw i8 %x , 32
3044
+ %c = icmp ult i8 %i , -32
3045
+ ret i1 %c
3046
+ }
3047
+
3048
+ define i1 @ult_add_nuw_nsw_C2_pow2_C_neg (i8 %x ) {
3049
+ ; CHECK-LABEL: @ult_add_nuw_nsw_C2_pow2_C_neg(
3050
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[X:%.*]], -64
3051
+ ; CHECK-NEXT: ret i1 [[C]]
3052
+ ;
3053
+ %i = add nuw nsw i8 %x , 32
3054
+ %c = icmp ult i8 %i , -32
3055
+ ret i1 %c
3056
+ }
3057
+
3058
+ define i1 @ult_add_C2_neg_C_pow2 (i8 %x ) {
3059
+ ; CHECK-LABEL: @ult_add_C2_neg_C_pow2(
3060
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -32
3061
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[TMP1]], 32
3062
+ ; CHECK-NEXT: ret i1 [[C]]
3063
+ ;
3064
+ %i = add i8 %x , -32
3065
+ %c = icmp ult i8 %i , 32
3066
+ ret i1 %c
3067
+ }
3068
+
3069
+ define <2 x i1 > @ult_add_C2_pow2_C_neg_vec (<2 x i8 > %x ) {
3070
+ ; CHECK-LABEL: @ult_add_C2_pow2_C_neg_vec(
3071
+ ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i8> [[X:%.*]], <i8 -32, i8 -32>
3072
+ ; CHECK-NEXT: [[C:%.*]] = icmp ne <2 x i8> [[TMP1]], <i8 -64, i8 -64>
3073
+ ; CHECK-NEXT: ret <2 x i1> [[C]]
3074
+ ;
3075
+ %i = add <2 x i8 > %x , <i8 32 , i8 32 >
3076
+ %c = icmp ult <2 x i8 > %i , <i8 -32 , i8 -32 >
3077
+ ret <2 x i1 > %c
3078
+ }
3079
+
3080
+ define i1 @ult_add_C2_pow2_C_neg_multiuse (i8 %x ) {
3081
+ ; CHECK-LABEL: @ult_add_C2_pow2_C_neg_multiuse(
3082
+ ; CHECK-NEXT: [[I:%.*]] = add i8 [[X:%.*]], 32
3083
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i8 [[I]], -32
3084
+ ; CHECK-NEXT: call void @use(i8 [[I]])
3085
+ ; CHECK-NEXT: ret i1 [[C]]
3086
+ ;
3087
+ %i = add i8 %x , 32
3088
+ %c = icmp ult i8 %i , -32
3089
+ call void @use (i8 %i )
3090
+ ret i1 %c
3091
+ }
3092
+
3093
+ define i1 @uge_add_C2_pow2_C_neg (i8 %x ) {
3094
+ ; CHECK-LABEL: @uge_add_C2_pow2_C_neg(
3095
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], -32
3096
+ ; CHECK-NEXT: [[C:%.*]] = icmp eq i8 [[TMP1]], -64
3097
+ ; CHECK-NEXT: ret i1 [[C]]
3098
+ ;
3099
+ %i = add i8 %x , 32
3100
+ %c = icmp uge i8 %i , -32
3101
+ ret i1 %c
3102
+ }
3103
+
3026
3104
declare void @llvm.assume (i1 )
0 commit comments