@@ -1333,3 +1333,136 @@ define i1 @ne_21_wrong_pred2(i32 %x, i32 %y) {
1333
1333
%c.210 = or i1 %c.2 , %c.1
1334
1334
ret i1 %c.210
1335
1335
}
1336
+
1337
+ define i1 @eq_optimized_highbits_cmp (i32 %x , i32 %y ) {
1338
+ ; CHECK-LABEL: @eq_optimized_highbits_cmp(
1339
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1340
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ult i32 [[XOR]], 33554432
1341
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i25
1342
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i25
1343
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp eq i25 [[TX]], [[TY]]
1344
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP_HI]], [[CMP_LO]]
1345
+ ; CHECK-NEXT: ret i1 [[R]]
1346
+ ;
1347
+ %xor = xor i32 %y , %x
1348
+ %cmp_hi = icmp ult i32 %xor , 33554432
1349
+ %tx = trunc i32 %x to i25
1350
+ %ty = trunc i32 %y to i25
1351
+ %cmp_lo = icmp eq i25 %tx , %ty
1352
+ %r = and i1 %cmp_hi , %cmp_lo
1353
+ ret i1 %r
1354
+ }
1355
+
1356
+ define i1 @eq_optimized_highbits_cmp_todo_overlapping (i32 %x , i32 %y ) {
1357
+ ; CHECK-LABEL: @eq_optimized_highbits_cmp_todo_overlapping(
1358
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1359
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ult i32 [[XOR]], 16777216
1360
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i25
1361
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i25
1362
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp eq i25 [[TX]], [[TY]]
1363
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP_HI]], [[CMP_LO]]
1364
+ ; CHECK-NEXT: ret i1 [[R]]
1365
+ ;
1366
+ %xor = xor i32 %y , %x
1367
+ %cmp_hi = icmp ult i32 %xor , 16777216
1368
+ %tx = trunc i32 %x to i25
1369
+ %ty = trunc i32 %y to i25
1370
+ %cmp_lo = icmp eq i25 %tx , %ty
1371
+ %r = and i1 %cmp_hi , %cmp_lo
1372
+ ret i1 %r
1373
+ }
1374
+
1375
+ define i1 @eq_optimized_highbits_cmp_fail_not_pow2 (i32 %x , i32 %y ) {
1376
+ ; CHECK-LABEL: @eq_optimized_highbits_cmp_fail_not_pow2(
1377
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1378
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ult i32 [[XOR]], 16777215
1379
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i24
1380
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i24
1381
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp eq i24 [[TX]], [[TY]]
1382
+ ; CHECK-NEXT: [[R:%.*]] = and i1 [[CMP_HI]], [[CMP_LO]]
1383
+ ; CHECK-NEXT: ret i1 [[R]]
1384
+ ;
1385
+ %xor = xor i32 %y , %x
1386
+ %cmp_hi = icmp ult i32 %xor , 16777215
1387
+ %tx = trunc i32 %x to i24
1388
+ %ty = trunc i32 %y to i24
1389
+ %cmp_lo = icmp eq i24 %tx , %ty
1390
+ %r = and i1 %cmp_hi , %cmp_lo
1391
+ ret i1 %r
1392
+ }
1393
+
1394
+ define i1 @ne_optimized_highbits_cmp (i32 %x , i32 %y ) {
1395
+ ; CHECK-LABEL: @ne_optimized_highbits_cmp(
1396
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1397
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 16777215
1398
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i24
1399
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i24
1400
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i24 [[TX]], [[TY]]
1401
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]
1402
+ ; CHECK-NEXT: ret i1 [[R]]
1403
+ ;
1404
+ %xor = xor i32 %y , %x
1405
+ %cmp_hi = icmp ugt i32 %xor , 16777215
1406
+ %tx = trunc i32 %x to i24
1407
+ %ty = trunc i32 %y to i24
1408
+ %cmp_lo = icmp ne i24 %tx , %ty
1409
+ %r = or i1 %cmp_hi , %cmp_lo
1410
+ ret i1 %r
1411
+ }
1412
+
1413
+ define i1 @ne_optimized_highbits_cmp_fail_not_mask (i32 %x , i32 %y ) {
1414
+ ; CHECK-LABEL: @ne_optimized_highbits_cmp_fail_not_mask(
1415
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1416
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 16777216
1417
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i24
1418
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i24
1419
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i24 [[TX]], [[TY]]
1420
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]
1421
+ ; CHECK-NEXT: ret i1 [[R]]
1422
+ ;
1423
+ %xor = xor i32 %y , %x
1424
+ %cmp_hi = icmp ugt i32 %xor , 16777216
1425
+ %tx = trunc i32 %x to i24
1426
+ %ty = trunc i32 %y to i24
1427
+ %cmp_lo = icmp ne i24 %tx , %ty
1428
+ %r = or i1 %cmp_hi , %cmp_lo
1429
+ ret i1 %r
1430
+ }
1431
+
1432
+ define i1 @ne_optimized_highbits_cmp_fail_no_combined_int (i32 %x , i32 %y ) {
1433
+ ; CHECK-LABEL: @ne_optimized_highbits_cmp_fail_no_combined_int(
1434
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1435
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 16777215
1436
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i23
1437
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i23
1438
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i23 [[TX]], [[TY]]
1439
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]
1440
+ ; CHECK-NEXT: ret i1 [[R]]
1441
+ ;
1442
+ %xor = xor i32 %y , %x
1443
+ %cmp_hi = icmp ugt i32 %xor , 16777215
1444
+ %tx = trunc i32 %x to i23
1445
+ %ty = trunc i32 %y to i23
1446
+ %cmp_lo = icmp ne i23 %tx , %ty
1447
+ %r = or i1 %cmp_hi , %cmp_lo
1448
+ ret i1 %r
1449
+ }
1450
+
1451
+ define i1 @ne_optimized_highbits_cmp_todo_overlapping (i32 %x , i32 %y ) {
1452
+ ; CHECK-LABEL: @ne_optimized_highbits_cmp_todo_overlapping(
1453
+ ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]]
1454
+ ; CHECK-NEXT: [[CMP_HI:%.*]] = icmp ugt i32 [[XOR]], 8388607
1455
+ ; CHECK-NEXT: [[TX:%.*]] = trunc i32 [[X]] to i24
1456
+ ; CHECK-NEXT: [[TY:%.*]] = trunc i32 [[Y]] to i24
1457
+ ; CHECK-NEXT: [[CMP_LO:%.*]] = icmp ne i24 [[TX]], [[TY]]
1458
+ ; CHECK-NEXT: [[R:%.*]] = or i1 [[CMP_HI]], [[CMP_LO]]
1459
+ ; CHECK-NEXT: ret i1 [[R]]
1460
+ ;
1461
+ %xor = xor i32 %y , %x
1462
+ %cmp_hi = icmp ugt i32 %xor , 8388607
1463
+ %tx = trunc i32 %x to i24
1464
+ %ty = trunc i32 %y to i24
1465
+ %cmp_lo = icmp ne i24 %tx , %ty
1466
+ %r = or i1 %cmp_hi , %cmp_lo
1467
+ ret i1 %r
1468
+ }
0 commit comments