@@ -3102,3 +3102,84 @@ define i1 @uge_add_C2_pow2_C_neg(i8 %x) {
3102
3102
}
3103
3103
3104
3104
declare void @llvm.assume (i1 )
3105
+
3106
+ ; Change an unsigned predicate to signed in icmp (add x, C1), C2
3107
+ define i1 @icmp_add_constant_with_constant_ult_to_slt (i32 range(i32 -4 , 10 ) %x ) {
3108
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ult_to_slt(
3109
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 8
3110
+ ; CHECK-NEXT: ret i1 [[CMP]]
3111
+ ;
3112
+ %add = add nsw i32 %x , 5
3113
+ %cmp = icmp ult i32 %add , 13
3114
+ ret i1 %cmp
3115
+ }
3116
+
3117
+ define i1 @icmp_add_constant_with_constant_ugt_to_sgt (i32 range(i32 -4 , 10 ) %x ) {
3118
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ugt_to_sgt(
3119
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], 2
3120
+ ; CHECK-NEXT: ret i1 [[CMP]]
3121
+ ;
3122
+ %add = add nsw i32 %x , 10
3123
+ %cmp = icmp ugt i32 %add , 12
3124
+ ret i1 %cmp
3125
+ }
3126
+
3127
+ ; Negative test: x + C1 may be negative
3128
+ define i1 @icmp_add_constant_with_constant_ult_to_slt_neg1 (i32 range(i32 -5 , 10 ) %x ) {
3129
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ult_to_slt_neg1(
3130
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], 4
3131
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], 20
3132
+ ; CHECK-NEXT: ret i1 [[CMP]]
3133
+ ;
3134
+ %add = add nsw i32 %x , 4
3135
+ %cmp = icmp ult i32 %add , 20
3136
+ ret i1 %cmp
3137
+ }
3138
+
3139
+ ; Negative test: missing nsw flag
3140
+ define i1 @icmp_add_constant_with_constant_ult_to_slt_neg2 (i8 range(i8 -4 , 120 ) %x ) {
3141
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ult_to_slt_neg2(
3142
+ ; CHECK-NEXT: [[ADD:%.*]] = add i8 [[X:%.*]], 15
3143
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[ADD]], 20
3144
+ ; CHECK-NEXT: ret i1 [[CMP]]
3145
+ ;
3146
+ %add = add i8 %x , 15
3147
+ %cmp = icmp ult i8 %add , 20
3148
+ ret i1 %cmp
3149
+ }
3150
+
3151
+ ; Negative test: C2 is negative
3152
+ define i1 @icmp_add_constant_with_constant_ult_to_slt_neg3 (i32 range(i32 -4 , 10 ) %x ) {
3153
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ult_to_slt_neg3(
3154
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], 4
3155
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], -6
3156
+ ; CHECK-NEXT: ret i1 [[CMP]]
3157
+ ;
3158
+ %add = add nsw i32 %x , 4
3159
+ %cmp = icmp ult i32 %add , -6
3160
+ ret i1 %cmp
3161
+ }
3162
+
3163
+ ; Negative test: C2 - C1 is negative
3164
+ define i1 @icmp_add_constant_with_constant_ult_to_slt_neg4 (i32 range(i32 -4 , 10 ) %x ) {
3165
+ ; CHECK-LABEL: @icmp_add_constant_with_constant_ult_to_slt_neg4(
3166
+ ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[X:%.*]], 5
3167
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], 2
3168
+ ; CHECK-NEXT: ret i1 [[CMP]]
3169
+ ;
3170
+ %add = add nsw i32 %x , 5
3171
+ %cmp = icmp ult i32 %add , 2
3172
+ ret i1 %cmp
3173
+ }
3174
+
3175
+ ; Same as before, but infer the range of ucmp
3176
+ define i1 @icmp_of_ucmp_plus_const_with_const (i32 %x , i32 %y ) {
3177
+ ; CHECK-LABEL: @icmp_of_ucmp_plus_const_with_const(
3178
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[X:%.*]], [[Y:%.*]]
3179
+ ; CHECK-NEXT: ret i1 [[CMP2]]
3180
+ ;
3181
+ %cmp1 = call i8 @llvm.ucmp (i32 %x , i32 %y )
3182
+ %add = add i8 %cmp1 , 1
3183
+ %cmp2 = icmp ult i8 %add , 2
3184
+ ret i1 %cmp2
3185
+ }
0 commit comments