Skip to content

Commit edb0708

Browse files
authored
[InstCombine] Implement fcmp (fadd x, 0.0), y => fcmp x, y optimization (#88476)
This PR addresses issue #88168. It implements an optimization for the case of ``` define i1 @fcmp_fadd_zero_ugt(float %x, float %y) { %add = fadd float %x, 0.000000e+00 %cmp = fcmp ugt float %add, %y ret i1 %cmp } ``` `=>` ``` define i1 @fcmp_fadd_zero_ugt(float %x, float %y) { %cmp = fcmp ugt float %x, %y ret i1 %cmp } ``` and all other types of `fcmp` instructions (`uge`, `ogt`, etc). Proofs: `fadd x, 0.0` https://alive2.llvm.org/ce/z/7FzNnM `fsub x, 0.0` https://alive2.llvm.org/ce/z/puUxLK
1 parent 4e2d11f commit edb0708

File tree

2 files changed

+210
-0
lines changed

2 files changed

+210
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8097,6 +8097,14 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
80978097
return new FCmpInst(I.getSwappedPredicate(), X, NegC, "", &I);
80988098
}
80998099

8100+
// fcmp (fadd X, 0.0), Y --> fcmp X, Y
8101+
if (match(Op0, m_FAdd(m_Value(X), m_AnyZeroFP())))
8102+
return new FCmpInst(Pred, X, Op1, "", &I);
8103+
8104+
// fcmp X, (fadd Y, 0.0) --> fcmp X, Y
8105+
if (match(Op1, m_FAdd(m_Value(Y), m_AnyZeroFP())))
8106+
return new FCmpInst(Pred, Op0, Y, "", &I);
8107+
81008108
if (match(Op0, m_FPExt(m_Value(X)))) {
81018109
// fcmp (fpext X), (fpext Y) -> fcmp X, Y
81028110
if (match(Op1, m_FPExt(m_Value(Y))) && X->getType() == Y->getType())

llvm/test/Transforms/InstCombine/fcmp.ll

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,3 +1284,205 @@ define <1 x i1> @bitcast_1vec_eq0(i32 %x) {
12841284
%cmp = fcmp oeq <1 x float> %f, zeroinitializer
12851285
ret <1 x i1> %cmp
12861286
}
1287+
1288+
; Simplify fcmp (x + 0.0), y => fcmp x, y
1289+
1290+
define i1 @fcmp_fadd_zero_ugt(float %x, float %y) {
1291+
; CHECK-LABEL: @fcmp_fadd_zero_ugt(
1292+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[ADD:%.*]], [[Y:%.*]]
1293+
; CHECK-NEXT: ret i1 [[CMP]]
1294+
;
1295+
%add = fadd float %x, 0.000000e+00
1296+
%cmp = fcmp ugt float %add, %y
1297+
ret i1 %cmp
1298+
}
1299+
1300+
define i1 @fcmp_fadd_zero_uge(float %x, float %y) {
1301+
; CHECK-LABEL: @fcmp_fadd_zero_uge(
1302+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uge float [[ADD:%.*]], [[Y:%.*]]
1303+
; CHECK-NEXT: ret i1 [[CMP]]
1304+
;
1305+
%add = fadd float %x, 0.000000e+00
1306+
%cmp = fcmp uge float %add, %y
1307+
ret i1 %cmp
1308+
}
1309+
1310+
define i1 @fcmp_fadd_zero_ogt(float %x, float %y) {
1311+
; CHECK-LABEL: @fcmp_fadd_zero_ogt(
1312+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[ADD:%.*]], [[Y:%.*]]
1313+
; CHECK-NEXT: ret i1 [[CMP]]
1314+
;
1315+
%add = fadd float %x, 0.000000e+00
1316+
%cmp = fcmp ogt float %add, %y
1317+
ret i1 %cmp
1318+
}
1319+
1320+
define i1 @fcmp_fadd_zero_oge(float %x, float %y) {
1321+
; CHECK-LABEL: @fcmp_fadd_zero_oge(
1322+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oge float [[ADD:%.*]], [[Y:%.*]]
1323+
; CHECK-NEXT: ret i1 [[CMP]]
1324+
;
1325+
%add = fadd float %x, 0.000000e+00
1326+
%cmp = fcmp oge float %add, %y
1327+
ret i1 %cmp
1328+
}
1329+
1330+
define i1 @fcmp_fadd_zero_ult(float %x, float %y) {
1331+
; CHECK-LABEL: @fcmp_fadd_zero_ult(
1332+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult float [[ADD:%.*]], [[Y:%.*]]
1333+
; CHECK-NEXT: ret i1 [[CMP]]
1334+
;
1335+
%add = fadd float %x, 0.000000e+00
1336+
%cmp = fcmp ult float %add, %y
1337+
ret i1 %cmp
1338+
}
1339+
1340+
define i1 @fcmp_fadd_zero_ule(float %x, float %y) {
1341+
; CHECK-LABEL: @fcmp_fadd_zero_ule(
1342+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ule float [[ADD:%.*]], [[Y:%.*]]
1343+
; CHECK-NEXT: ret i1 [[CMP]]
1344+
;
1345+
%add = fadd float %x, 0.000000e+00
1346+
%cmp = fcmp ule float %add, %y
1347+
ret i1 %cmp
1348+
}
1349+
1350+
define i1 @fcmp_fadd_zero_olt(float %x, float %y) {
1351+
; CHECK-LABEL: @fcmp_fadd_zero_olt(
1352+
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[ADD:%.*]], [[Y:%.*]]
1353+
; CHECK-NEXT: ret i1 [[CMP]]
1354+
;
1355+
%add = fadd float %x, 0.000000e+00
1356+
%cmp = fcmp olt float %add, %y
1357+
ret i1 %cmp
1358+
}
1359+
1360+
define i1 @fcmp_fadd_zero_ole(float %x, float %y) {
1361+
; CHECK-LABEL: @fcmp_fadd_zero_ole(
1362+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ole float [[ADD:%.*]], [[Y:%.*]]
1363+
; CHECK-NEXT: ret i1 [[CMP]]
1364+
;
1365+
%add = fadd float %x, 0.000000e+00
1366+
%cmp = fcmp ole float %add, %y
1367+
ret i1 %cmp
1368+
}
1369+
1370+
define i1 @fcmp_fadd_zero_oeq(float %x, float %y) {
1371+
; CHECK-LABEL: @fcmp_fadd_zero_oeq(
1372+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[ADD:%.*]], [[Y:%.*]]
1373+
; CHECK-NEXT: ret i1 [[CMP]]
1374+
;
1375+
%add = fadd float %x, 0.000000e+00
1376+
%cmp = fcmp oeq float %add, %y
1377+
ret i1 %cmp
1378+
}
1379+
1380+
define i1 @fcmp_fadd_zero_one(float %x, float %y) {
1381+
; CHECK-LABEL: @fcmp_fadd_zero_one(
1382+
; CHECK-NEXT: [[CMP:%.*]] = fcmp one float [[ADD:%.*]], [[Y:%.*]]
1383+
; CHECK-NEXT: ret i1 [[CMP]]
1384+
;
1385+
%add = fadd float %x, 0.000000e+00
1386+
%cmp = fcmp one float %add, %y
1387+
ret i1 %cmp
1388+
}
1389+
1390+
define i1 @fcmp_fadd_zero_ueq(float %x, float %y) {
1391+
; CHECK-LABEL: @fcmp_fadd_zero_ueq(
1392+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ueq float [[ADD:%.*]], [[Y:%.*]]
1393+
; CHECK-NEXT: ret i1 [[CMP]]
1394+
;
1395+
%add = fadd float %x, 0.000000e+00
1396+
%cmp = fcmp ueq float %add, %y
1397+
ret i1 %cmp
1398+
}
1399+
1400+
define i1 @fcmp_fadd_zero_une(float %x, float %y) {
1401+
; CHECK-LABEL: @fcmp_fadd_zero_une(
1402+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une float [[ADD:%.*]], [[Y:%.*]]
1403+
; CHECK-NEXT: ret i1 [[CMP]]
1404+
;
1405+
%add = fadd float %x, 0.000000e+00
1406+
%cmp = fcmp une float %add, %y
1407+
ret i1 %cmp
1408+
}
1409+
1410+
define i1 @fcmp_fadd_zero_ord(float %x, float %y) {
1411+
; CHECK-LABEL: @fcmp_fadd_zero_ord(
1412+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ord float [[ADD:%.*]], [[Y:%.*]]
1413+
; CHECK-NEXT: ret i1 [[CMP]]
1414+
;
1415+
%add = fadd float %x, 0.000000e+00
1416+
%cmp = fcmp ord float %add, %y
1417+
ret i1 %cmp
1418+
}
1419+
1420+
define i1 @fcmp_fadd_zero_uno(float %x, float %y) {
1421+
; CHECK-LABEL: @fcmp_fadd_zero_uno(
1422+
; CHECK-NEXT: [[CMP:%.*]] = fcmp uno float [[ADD:%.*]], [[Y:%.*]]
1423+
; CHECK-NEXT: ret i1 [[CMP]]
1424+
;
1425+
%add = fadd float %x, 0.000000e+00
1426+
%cmp = fcmp uno float %add, %y
1427+
ret i1 %cmp
1428+
}
1429+
1430+
define i1 @fcmp_fadd_neg_zero(float %x, float %y) {
1431+
; CHECK-LABEL: @fcmp_fadd_neg_zero(
1432+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]]
1433+
; CHECK-NEXT: ret i1 [[CMP]]
1434+
;
1435+
%add = fadd float %x, -0.000000e+00
1436+
%cmp = fcmp ugt float %add, %y
1437+
ret i1 %cmp
1438+
}
1439+
1440+
define i1 @fcmp_fadd_zero_switched(float %x, float %y) {
1441+
; CHECK-LABEL: @fcmp_fadd_zero_switched(
1442+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult float [[Y:%.*]], [[X:%.*]]
1443+
; CHECK-NEXT: ret i1 [[CMP]]
1444+
;
1445+
%add = fadd float %y, 0.000000e+00
1446+
%cmp = fcmp ugt float %x, %add
1447+
ret i1 %cmp
1448+
}
1449+
1450+
define <2 x i1> @fcmp_fadd_zero_vec(<2 x float> %x, <2 x float> %y) {
1451+
; CHECK-LABEL: @fcmp_fadd_zero_vec(
1452+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt <2 x float> [[X:%.*]], [[Y:%.*]]
1453+
; CHECK-NEXT: ret <2 x i1> [[CMP]]
1454+
;
1455+
%add = fadd <2 x float> %x, <float 0.0, float -0.0>
1456+
%cmp = fcmp ugt <2 x float> %add, %y
1457+
ret <2 x i1> %cmp
1458+
}
1459+
1460+
define i1 @fcmp_fast_fadd_fast_zero(float %x, float %y) {
1461+
; CHECK-LABEL: @fcmp_fast_fadd_fast_zero(
1462+
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast ugt float [[X:%.*]], [[Y:%.*]]
1463+
; CHECK-NEXT: ret i1 [[CMP]]
1464+
;
1465+
%add = fadd fast float %x, 0.000000e+00
1466+
%cmp = fcmp fast ugt float %add, %y
1467+
ret i1 %cmp
1468+
}
1469+
1470+
define i1 @fcmp_fast_fadd_zero(float %x, float %y) {
1471+
; CHECK-LABEL: @fcmp_fast_fadd_zero(
1472+
; CHECK-NEXT: [[CMP:%.*]] = fcmp fast ugt float [[X:%.*]], [[Y:%.*]]
1473+
; CHECK-NEXT: ret i1 [[CMP]]
1474+
;
1475+
%add = fadd float %x, 0.000000e+00
1476+
%cmp = fcmp fast ugt float %add, %y
1477+
ret i1 %cmp
1478+
}
1479+
1480+
define i1 @fcmp_fadd_fast_zero(float %x, float %y) {
1481+
; CHECK-LABEL: @fcmp_fadd_fast_zero(
1482+
; CHECK-NEXT: [[CMP:%.*]] = fcmp ugt float [[X:%.*]], [[Y:%.*]]
1483+
; CHECK-NEXT: ret i1 [[CMP]]
1484+
;
1485+
%add = fadd fast float %x, 0.000000e+00
1486+
%cmp = fcmp ugt float %add, %y
1487+
ret i1 %cmp
1488+
}

0 commit comments

Comments
 (0)