@@ -1243,3 +1243,40 @@ define i1 @and_two_ranges_to_mask_and_range_no_add_on_one_range(i16 %x) {
1243
1243
%and = and i1 %cmp1 , %or
1244
1244
ret i1 %and
1245
1245
}
1246
+
1247
+ ; This tests an "is_alpha" style check for the combination of logical or
1248
+ ; and nowrap flags on the adds. In this case, the logical or will not be
1249
+ ; converted into a bitwise or.
1250
+ define i1 @is_ascii_alphabetic (i32 %char ) {
1251
+ ; CHECK-LABEL: @is_ascii_alphabetic(
1252
+ ; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[CHAR:%.*]], -65
1253
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[ADD1]], 26
1254
+ ; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[CHAR]], -97
1255
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[ADD2]], 26
1256
+ ; CHECK-NEXT: [[LOGICAL:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]
1257
+ ; CHECK-NEXT: ret i1 [[LOGICAL]]
1258
+ ;
1259
+ %add1 = add nsw i32 %char , -65
1260
+ %cmp1 = icmp ult i32 %add1 , 26
1261
+ %add2 = add nsw i32 %char , -97
1262
+ %cmp2 = icmp ult i32 %add2 , 26
1263
+ %logical = select i1 %cmp1 , i1 true , i1 %cmp2
1264
+ ret i1 %logical
1265
+ }
1266
+
1267
+ define i1 @is_ascii_alphabetic_inverted (i32 %char ) {
1268
+ ; CHECK-LABEL: @is_ascii_alphabetic_inverted(
1269
+ ; CHECK-NEXT: [[ADD1:%.*]] = add nsw i32 [[CHAR:%.*]], -91
1270
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i32 [[ADD1]], -26
1271
+ ; CHECK-NEXT: [[ADD2:%.*]] = add nsw i32 [[CHAR]], -123
1272
+ ; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[ADD2]], -26
1273
+ ; CHECK-NEXT: [[LOGICAL:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
1274
+ ; CHECK-NEXT: ret i1 [[LOGICAL]]
1275
+ ;
1276
+ %add1 = add nsw i32 %char , -91
1277
+ %cmp1 = icmp ult i32 %add1 , -26
1278
+ %add2 = add nsw i32 %char , -123
1279
+ %cmp2 = icmp ult i32 %add2 , -26
1280
+ %logical = select i1 %cmp1 , i1 %cmp2 , i1 false
1281
+ ret i1 %logical
1282
+ }
0 commit comments