[llvm] [InstCombine] fold `cond ? x : -x == 0` into `x == 0` (PR #85673)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 17 02:07:14 PDT 2024
https://github.com/SahilPatidar updated https://github.com/llvm/llvm-project/pull/85673
>From 33da0302b3d1f2a0a3f17d6ac143f591ed6affec Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Mon, 18 Mar 2024 09:32:59 +0530
Subject: [PATCH 1/6] [InstCombine] FP fold, cond ? x : -x == 0 into x == 0
#85250
---
.../InstCombine/InstCombineCompares.cpp | 7 ++
llvm/test/Transforms/InstCombine/fcmp.ll | 107 ++++++++++++++++++
2 files changed, 114 insertions(+)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index db302d7e526844..336ea42db01d22 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -8016,6 +8016,13 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
Constant *RHSC;
if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
switch (LHSI->getOpcode()) {
+ case Instruction::Select:
+ if ((Pred == FCmpInst::FCMP_UEQ || Pred == FCmpInst::FCMP_OEQ ||
+ Pred == FCmpInst::FCMP_UNE || Pred == FCmpInst::FCMP_ONE) &&
+ match(LHSI, m_Select(m_Value(), m_Value(X), m_FNeg(m_Value(Y)))) &&
+ X == Y && match(RHSC, m_AnyZeroFP()))
+ return new FCmpInst(Pred, X, RHSC);
+ break;
case Instruction::PHI:
if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
return NV;
diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll
index f2701d16d0f3d1..3e08e1441626bc 100644
--- a/llvm/test/Transforms/InstCombine/fcmp.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp.ll
@@ -1284,3 +1284,110 @@ define <1 x i1> @bitcast_1vec_eq0(i32 %x) {
%cmp = fcmp oeq <1 x float> %f, zeroinitializer
ret <1 x i1> %cmp
}
+
+define i1 @fcmp_ueq_sel_x_negx(float %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx(
+; CHECK-NEXT: [[RES:%.*]] = fcmp ueq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp ueq float %x, 0.000000e+00
+ %neg = fneg fast float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp ueq float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_une_sel_x_negx(float %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx(
+; CHECK-NEXT: [[RES:%.*]] = fcmp une float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp une float %x, 0.000000e+00
+ %neg = fneg fast float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp une float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_oeq_sel_x_negx(float %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx(
+; CHECK-NEXT: [[RES:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp oeq float %x, 0.000000e+00
+ %neg = fneg fast float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp oeq float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_one_sel_x_negx(float %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx(
+; CHECK-NEXT: [[RES:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp one float %x, 0.000000e+00
+ %neg = fneg fast float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp one float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define <8 x i1> @fcmp_ueq_sel_x_negx_vec(<8 x float> %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_vec(
+; CHECK-NEXT: [[RES:%.*]] = fcmp ueq <8 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <8 x i1> [[RES]]
+;
+ %f = fcmp ueq <8 x float> %x, zeroinitializer
+ %neg = fneg fast <8 x float> %x
+ %sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
+ %res = fcmp ueq <8 x float> %sel, zeroinitializer
+ ret <8 x i1> %res
+}
+
+define <8 x i1> @fcmp_une_sel_x_negx_vec(<8 x float> %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_vec(
+; CHECK-NEXT: [[RES:%.*]] = fcmp une <8 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <8 x i1> [[RES]]
+;
+ %f = fcmp une <8 x float> %x, zeroinitializer
+ %neg = fneg fast <8 x float> %x
+ %sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
+ %res = fcmp une <8 x float> %sel, zeroinitializer
+ ret <8 x i1> %res
+}
+
+define <8 x i1> @fcmp_oeq_sel_x_negx_vec(<8 x float> %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_vec(
+; CHECK-NEXT: [[RES:%.*]] = fcmp oeq <8 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <8 x i1> [[RES]]
+;
+ %f = fcmp oeq <8 x float> %x, zeroinitializer
+ %neg = fneg fast <8 x float> %x
+ %sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
+ %res = fcmp oeq <8 x float> %sel, zeroinitializer
+ ret <8 x i1> %res
+}
+
+define <8 x i1> @fcmp_one_sel_x_negx_vec(<8 x float> %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_vec(
+; CHECK-NEXT: [[RES:%.*]] = fcmp one <8 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <8 x i1> [[RES]]
+;
+ %f = fcmp one <8 x float> %x, zeroinitializer
+ %neg = fneg fast <8 x float> %x
+ %sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
+ %res = fcmp one <8 x float> %sel, zeroinitializer
+ ret <8 x i1> %res
+}
+
+define i1 @fcmp_sel_x_negx_with_any_cond(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_sel_x_negx_with_any_cond(
+; CHECK-NEXT: [[RES:%.*]] = fcmp ueq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp ueq float %sel, 0.000000e+00
+ ret i1 %res
+}
>From e1095c9bb0e677801d4fc03137c35f6e86627e92 Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Sat, 23 Mar 2024 17:10:57 +0530
Subject: [PATCH 2/6] Fixes and updates tests
---
.../InstCombine/InstCombineCompares.cpp | 10 +--
llvm/test/Transforms/InstCombine/fcmp.ll | 64 ++++++++++++++++---
2 files changed, 61 insertions(+), 13 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 336ea42db01d22..39b6817f79781c 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -8017,11 +8017,11 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
switch (LHSI->getOpcode()) {
case Instruction::Select:
- if ((Pred == FCmpInst::FCMP_UEQ || Pred == FCmpInst::FCMP_OEQ ||
- Pred == FCmpInst::FCMP_UNE || Pred == FCmpInst::FCMP_ONE) &&
- match(LHSI, m_Select(m_Value(), m_Value(X), m_FNeg(m_Value(Y)))) &&
- X == Y && match(RHSC, m_AnyZeroFP()))
- return new FCmpInst(Pred, X, RHSC);
+ if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
+ (match(LHSI,
+ m_Select(m_Value(), m_Value(X), m_FNeg(m_Deferred(X)))) ||
+ match(LHSI, m_Select(m_Value(), m_FNeg(m_Value(X)), m_Deferred(X)))))
+ return new FCmpInst(Pred, X, RHSC, "", &I);
break;
case Instruction::PHI:
if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll
index 3e08e1441626bc..8d3234ba3feda4 100644
--- a/llvm/test/Transforms/InstCombine/fcmp.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp.ll
@@ -1291,7 +1291,7 @@ define i1 @fcmp_ueq_sel_x_negx(float %x) {
; CHECK-NEXT: ret i1 [[RES]]
;
%f = fcmp ueq float %x, 0.000000e+00
- %neg = fneg fast float %x
+ %neg = fneg float %x
%sel = select i1 %f, float %x, float %neg
%res = fcmp ueq float %sel, 0.000000e+00
ret i1 %res
@@ -1303,7 +1303,7 @@ define i1 @fcmp_une_sel_x_negx(float %x) {
; CHECK-NEXT: ret i1 [[RES]]
;
%f = fcmp une float %x, 0.000000e+00
- %neg = fneg fast float %x
+ %neg = fneg float %x
%sel = select i1 %f, float %x, float %neg
%res = fcmp une float %sel, 0.000000e+00
ret i1 %res
@@ -1315,7 +1315,7 @@ define i1 @fcmp_oeq_sel_x_negx(float %x) {
; CHECK-NEXT: ret i1 [[RES]]
;
%f = fcmp oeq float %x, 0.000000e+00
- %neg = fneg fast float %x
+ %neg = fneg float %x
%sel = select i1 %f, float %x, float %neg
%res = fcmp oeq float %sel, 0.000000e+00
ret i1 %res
@@ -1327,19 +1327,67 @@ define i1 @fcmp_one_sel_x_negx(float %x) {
; CHECK-NEXT: ret i1 [[RES]]
;
%f = fcmp one float %x, 0.000000e+00
- %neg = fneg fast float %x
+ %neg = fneg float %x
%sel = select i1 %f, float %x, float %neg
%res = fcmp one float %sel, 0.000000e+00
ret i1 %res
}
+define i1 @fcmp_ueq_sel_x_negx_nzero(float %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_nzero(
+; CHECK-NEXT: [[RES:%.*]] = fcmp ueq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp ueq float %x, 0.000000e+00
+ %neg = fneg float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp ueq float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_une_sel_x_negx_nzero(float %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_nzero(
+; CHECK-NEXT: [[RES:%.*]] = fcmp une float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp une float %x, 0.000000e+00
+ %neg = fneg float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp une float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_oeq_sel_x_negx_nzero(float %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_nzero(
+; CHECK-NEXT: [[RES:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp oeq float %x, 0.000000e+00
+ %neg = fneg float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp oeq float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_one_sel_x_negx_nzero(float %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_nzero(
+; CHECK-NEXT: [[RES:%.*]] = fcmp one float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %f = fcmp one float %x, 0.000000e+00
+ %neg = fneg float %x
+ %sel = select i1 %f, float %x, float %neg
+ %res = fcmp one float %sel, -0.000000e+00
+ ret i1 %res
+}
+
define <8 x i1> @fcmp_ueq_sel_x_negx_vec(<8 x float> %x) {
; CHECK-LABEL: @fcmp_ueq_sel_x_negx_vec(
; CHECK-NEXT: [[RES:%.*]] = fcmp ueq <8 x float> [[X:%.*]], zeroinitializer
; CHECK-NEXT: ret <8 x i1> [[RES]]
;
%f = fcmp ueq <8 x float> %x, zeroinitializer
- %neg = fneg fast <8 x float> %x
+ %neg = fneg <8 x float> %x
%sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
%res = fcmp ueq <8 x float> %sel, zeroinitializer
ret <8 x i1> %res
@@ -1351,7 +1399,7 @@ define <8 x i1> @fcmp_une_sel_x_negx_vec(<8 x float> %x) {
; CHECK-NEXT: ret <8 x i1> [[RES]]
;
%f = fcmp une <8 x float> %x, zeroinitializer
- %neg = fneg fast <8 x float> %x
+ %neg = fneg <8 x float> %x
%sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
%res = fcmp une <8 x float> %sel, zeroinitializer
ret <8 x i1> %res
@@ -1363,7 +1411,7 @@ define <8 x i1> @fcmp_oeq_sel_x_negx_vec(<8 x float> %x) {
; CHECK-NEXT: ret <8 x i1> [[RES]]
;
%f = fcmp oeq <8 x float> %x, zeroinitializer
- %neg = fneg fast <8 x float> %x
+ %neg = fneg <8 x float> %x
%sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
%res = fcmp oeq <8 x float> %sel, zeroinitializer
ret <8 x i1> %res
@@ -1375,7 +1423,7 @@ define <8 x i1> @fcmp_one_sel_x_negx_vec(<8 x float> %x) {
; CHECK-NEXT: ret <8 x i1> [[RES]]
;
%f = fcmp one <8 x float> %x, zeroinitializer
- %neg = fneg fast <8 x float> %x
+ %neg = fneg <8 x float> %x
%sel = select <8 x i1> %f, <8 x float> %x, <8 x float> %neg
%res = fcmp one <8 x float> %sel, zeroinitializer
ret <8 x i1> %res
>From 0cc24c8490dcab248f2165ee86a955bb9927dc52 Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Tue, 26 Mar 2024 15:34:41 +0530
Subject: [PATCH 3/6] Add and update tests for any fp zero
---
.../InstCombine/InstCombineCompares.cpp | 1 +
llvm/test/Transforms/InstCombine/fcmp.ll | 85 ++++++++++++++++++-
2 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 39b6817f79781c..2a7f4ce5284ece 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -8017,6 +8017,7 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
if (match(Op0, m_Instruction(LHSI)) && match(Op1, m_Constant(RHSC))) {
switch (LHSI->getOpcode()) {
case Instruction::Select:
+ // fcmp eq (cond ? x : -x), 0 --> fcmp eq x, 0
if (FCmpInst::isEquality(Pred) && match(RHSC, m_AnyZeroFP()) &&
(match(LHSI,
m_Select(m_Value(), m_Value(X), m_FNeg(m_Deferred(X)))) ||
diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll
index 8d3234ba3feda4..30807c5885f911 100644
--- a/llvm/test/Transforms/InstCombine/fcmp.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp.ll
@@ -1429,13 +1429,90 @@ define <8 x i1> @fcmp_one_sel_x_negx_vec(<8 x float> %x) {
ret <8 x i1> %res
}
-define i1 @fcmp_sel_x_negx_with_any_cond(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_sel_x_negx_with_any_cond(
-; CHECK-NEXT: [[RES:%.*]] = fcmp ueq float [[X:%.*]], 0.000000e+00
+define <2 x i1> @fcmp_oeq_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_any_fpzero_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
+;
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp oeq <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
+}
+
+define <2 x i1> @fcmp_one_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_with_any_fpzero_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp one <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
+;
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp one <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
+}
+
+define <2 x i1> @fcmp_ueq_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_any_fpzero_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp ueq <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
+;
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp ueq <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
+}
+
+define <2 x i1> @fcmp_une_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_with_any_fpzero_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp une <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
+;
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp une <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
+}
+
+define i1 @fcmp_ueq_sel_x_negx_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast ueq float [[X:%.*]], 0.000000e+00
; CHECK-NEXT: ret i1 [[RES]]
;
%neg = fneg float %x
%sel = select i1 %c, float %x, float %neg
- %res = fcmp ueq float %sel, 0.000000e+00
+ %res = fcmp fast ueq float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_une_sel_x_negx_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast une float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast une float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_oeq_sel_x_negx_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast oeq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast oeq float %sel, 0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_one_sel_x_negx_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast one float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast one float %sel, 0.000000e+00
ret i1 %res
}
>From 1d037e009168c2d6f38c35489f314a885e95edec Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Tue, 9 Apr 2024 14:53:46 +0530
Subject: [PATCH 4/6] add and update fmf tests
---
llvm/test/Transforms/InstCombine/fcmp.ll | 44 ++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll
index 30807c5885f911..8168cd02c9755c 100644
--- a/llvm/test/Transforms/InstCombine/fcmp.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp.ll
@@ -1516,3 +1516,47 @@ define i1 @fcmp_one_sel_x_negx_with_fmf(float %x, i1 %c) {
%res = fcmp fast one float %sel, 0.000000e+00
ret i1 %res
}
+
+define i1 @fcmp_ueq_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_nzero_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast ueq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast ueq float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_une_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_nzero_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast une float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast une float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_oeq_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_nzero_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast oeq float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast oeq float %sel, -0.000000e+00
+ ret i1 %res
+}
+
+define i1 @fcmp_one_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_nzero_with_fmf(
+; CHECK-NEXT: [[RES:%.*]] = fcmp fast one float [[X:%.*]], 0.000000e+00
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %neg = fneg float %x
+ %sel = select i1 %c, float %x, float %neg
+ %res = fcmp fast one float %sel, -0.000000e+00
+ ret i1 %res
+}
>From 82d63f45d2e6f82a7d8ad307c9324016ce9361cb Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Sat, 13 Apr 2024 14:11:09 +0530
Subject: [PATCH 5/6] update test with ninf and nnan flag
---
llvm/test/Transforms/InstCombine/fcmp.ll | 140 ++++++++---------------
1 file changed, 48 insertions(+), 92 deletions(-)
diff --git a/llvm/test/Transforms/InstCombine/fcmp.ll b/llvm/test/Transforms/InstCombine/fcmp.ll
index 8168cd02c9755c..cd87570504de30 100644
--- a/llvm/test/Transforms/InstCombine/fcmp.ll
+++ b/llvm/test/Transforms/InstCombine/fcmp.ll
@@ -1429,134 +1429,90 @@ define <8 x i1> @fcmp_one_sel_x_negx_vec(<8 x float> %x) {
ret <8 x i1> %res
}
-define <2 x i1> @fcmp_oeq_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
-; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_any_fpzero_vec(
-; CHECK-NEXT: [[ICMP:%.*]] = fcmp oeq <2 x float> [[X:%.*]], zeroinitializer
+define <2 x i1> @fcmp_oeq_sel_x_negx_with_any_fpzero_ninf_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_any_fpzero_ninf_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp ninf oeq <2 x float> [[X:%.*]], zeroinitializer
; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
%fneg = fneg <2 x float> %x
%sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
- %icmp = fcmp oeq <2 x float> %sel, <float 0.0, float -0.0>
+ %icmp = fcmp ninf oeq <2 x float> %sel, <float 0.0, float -0.0>
ret <2 x i1> %icmp
}
-define <2 x i1> @fcmp_one_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
-; CHECK-LABEL: @fcmp_one_sel_x_negx_with_any_fpzero_vec(
-; CHECK-NEXT: [[ICMP:%.*]] = fcmp one <2 x float> [[X:%.*]], zeroinitializer
+define <2 x i1> @fcmp_one_sel_x_negx_with_any_fpzero_ninf_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_with_any_fpzero_ninf_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp ninf one <2 x float> [[X:%.*]], zeroinitializer
; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
%fneg = fneg <2 x float> %x
%sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
- %icmp = fcmp one <2 x float> %sel, <float 0.0, float -0.0>
+ %icmp = fcmp ninf one <2 x float> %sel, <float 0.0, float -0.0>
ret <2 x i1> %icmp
}
-define <2 x i1> @fcmp_ueq_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
-; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_any_fpzero_vec(
-; CHECK-NEXT: [[ICMP:%.*]] = fcmp ueq <2 x float> [[X:%.*]], zeroinitializer
+define <2 x i1> @fcmp_ueq_sel_x_negx_with_any_fpzero_ninf_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_any_fpzero_ninf_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp ninf ueq <2 x float> [[X:%.*]], zeroinitializer
; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
%fneg = fneg <2 x float> %x
%sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
- %icmp = fcmp ueq <2 x float> %sel, <float 0.0, float -0.0>
+ %icmp = fcmp ninf ueq <2 x float> %sel, <float 0.0, float -0.0>
ret <2 x i1> %icmp
}
-define <2 x i1> @fcmp_une_sel_x_negx_with_any_fpzero_vec(<2 x i1> %cond, <2 x float> %x) {
-; CHECK-LABEL: @fcmp_une_sel_x_negx_with_any_fpzero_vec(
-; CHECK-NEXT: [[ICMP:%.*]] = fcmp une <2 x float> [[X:%.*]], zeroinitializer
+define <2 x i1> @fcmp_une_sel_x_negx_with_any_fpzero_ninf_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_with_any_fpzero_ninf_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp ninf une <2 x float> [[X:%.*]], zeroinitializer
; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
%fneg = fneg <2 x float> %x
%sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
- %icmp = fcmp une <2 x float> %sel, <float 0.0, float -0.0>
+ %icmp = fcmp ninf une <2 x float> %sel, <float 0.0, float -0.0>
ret <2 x i1> %icmp
}
-define i1 @fcmp_ueq_sel_x_negx_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast ueq float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
-;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast ueq float %sel, 0.000000e+00
- ret i1 %res
-}
-
-define i1 @fcmp_une_sel_x_negx_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_une_sel_x_negx_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast une float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
-;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast une float %sel, 0.000000e+00
- ret i1 %res
-}
-
-define i1 @fcmp_oeq_sel_x_negx_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast oeq float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
-;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast oeq float %sel, 0.000000e+00
- ret i1 %res
-}
-
-define i1 @fcmp_one_sel_x_negx_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_one_sel_x_negx_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast one float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
-;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast one float %sel, 0.000000e+00
- ret i1 %res
-}
-
-define i1 @fcmp_ueq_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_ueq_sel_x_negx_nzero_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast ueq float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
+define <2 x i1> @fcmp_oeq_sel_x_negx_with_any_fpzero_nnan_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_oeq_sel_x_negx_with_any_fpzero_nnan_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp nnan oeq <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast ueq float %sel, -0.000000e+00
- ret i1 %res
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp nnan oeq <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
}
-define i1 @fcmp_une_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_une_sel_x_negx_nzero_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast une float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
+define <2 x i1> @fcmp_one_sel_x_negx_with_any_fpzero_nnan_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_one_sel_x_negx_with_any_fpzero_nnan_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp nnan one <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast une float %sel, -0.000000e+00
- ret i1 %res
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp nnan one <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
}
-define i1 @fcmp_oeq_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_oeq_sel_x_negx_nzero_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast oeq float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
+define <2 x i1> @fcmp_ueq_sel_x_negx_with_any_fpzero_nnan_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_ueq_sel_x_negx_with_any_fpzero_nnan_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp nnan ueq <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast oeq float %sel, -0.000000e+00
- ret i1 %res
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp nnan ueq <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
}
-define i1 @fcmp_one_sel_x_negx_nzero_with_fmf(float %x, i1 %c) {
-; CHECK-LABEL: @fcmp_one_sel_x_negx_nzero_with_fmf(
-; CHECK-NEXT: [[RES:%.*]] = fcmp fast one float [[X:%.*]], 0.000000e+00
-; CHECK-NEXT: ret i1 [[RES]]
+define <2 x i1> @fcmp_une_sel_x_negx_with_any_fpzero_nnan_vec(<2 x i1> %cond, <2 x float> %x) {
+; CHECK-LABEL: @fcmp_une_sel_x_negx_with_any_fpzero_nnan_vec(
+; CHECK-NEXT: [[ICMP:%.*]] = fcmp nnan une <2 x float> [[X:%.*]], zeroinitializer
+; CHECK-NEXT: ret <2 x i1> [[ICMP]]
;
- %neg = fneg float %x
- %sel = select i1 %c, float %x, float %neg
- %res = fcmp fast one float %sel, -0.000000e+00
- ret i1 %res
+ %fneg = fneg <2 x float> %x
+ %sel = select <2 x i1> %cond, <2 x float> %x, <2 x float> %fneg
+ %icmp = fcmp nnan une <2 x float> %sel, <float 0.0, float -0.0>
+ ret <2 x i1> %icmp
}
>From 5ed882dde4ca870e767d7fbeec63b985bbece3fd Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Wed, 17 Apr 2024 14:29:49 +0530
Subject: [PATCH 6/6] add replaceOperand
---
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 2a7f4ce5284ece..4a66824bc90eef 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -8022,7 +8022,7 @@ Instruction *InstCombinerImpl::visitFCmpInst(FCmpInst &I) {
(match(LHSI,
m_Select(m_Value(), m_Value(X), m_FNeg(m_Deferred(X)))) ||
match(LHSI, m_Select(m_Value(), m_FNeg(m_Value(X)), m_Deferred(X)))))
- return new FCmpInst(Pred, X, RHSC, "", &I);
+ return replaceOperand(I, 0, X);
break;
case Instruction::PHI:
if (Instruction *NV = foldOpIntoPhi(I, cast<PHINode>(LHSI)))
More information about the llvm-commits
mailing list