Skip to content

Commit 8208f91

Browse files
committed
[InstCombine] Add tests for new eq/ne patterns combining eq/ne by parts; NFC
1 parent 71be514 commit 8208f91

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

llvm/test/Transforms/InstCombine/eq-of-parts.ll

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,3 +1333,136 @@ define i1 @ne_21_wrong_pred2(i32 %x, i32 %y) {
13331333
%c.210 = or i1 %c.2, %c.1
13341334
ret i1 %c.210
13351335
}
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

Comments
 (0)