[llvm] [InstCombine] FP fold, cond ? x : -x == 0 into x == 0 #85250 (PR #85673)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 18 10:41:00 PDT 2024
https://github.com/SahilPatidar created https://github.com/llvm/llvm-project/pull/85673
Resolve #85250
Alive2: https://alive2.llvm.org/ce/z/NFEKjp
>From f23d911a0a89aacd012d8a2ca29db12dd206d6ac Mon Sep 17 00:00:00 2001
From: SahilPatidar <patidarsahil2001 at gmail.com>
Date: Mon, 18 Mar 2024 09:32:59 +0530
Subject: [PATCH] [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 0dce0077bf1588..6d5ef3c6718554 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -7972,6 +7972,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 159c84d0dd8aa9..ac5476159dd4ef 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
+}
More information about the llvm-commits
mailing list