[llvm] Remove m_OneUse check only for max, not min (PR #81505)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 12 09:58:14 PST 2024
https://github.com/AtariDreams created https://github.com/llvm/llvm-project/pull/81505
If it is ever determined that min doesn't need one-use, then we can in fact remove that version entirely.
>From 3f7197f99aaa86c8278b2509c3d5cf3fb683541a Mon Sep 17 00:00:00 2001
From: Rose <83477269+AtariDreams at users.noreply.github.com>
Date: Mon, 12 Feb 2024 11:25:24 -0500
Subject: [PATCH] Remove m_OneUse check only for max, not min
If it is ever determined that min doesn't need one-use, then we can in fact remove that version entirely.
---
.../InstCombine/InstCombineCalls.cpp | 27 ++++++++++++++-----
llvm/test/Transforms/InstCombine/maximum.ll | 2 +-
llvm/test/Transforms/InstCombine/maxnum.ll | 2 +-
3 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 56d1259e955196..4525f4e5c45832 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -2265,14 +2265,29 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// max X, -X --> fabs X
// min X, -X --> -(fabs X)
- // TODO: Remove one-use limitation? That is obviously better for max.
- // It would be an extra instruction for min (fnabs), but that is
- // still likely better for analysis and codegen.
- if ((match(Arg0, m_OneUse(m_FNeg(m_Value(X)))) && Arg1 == X) ||
- (match(Arg1, m_OneUse(m_FNeg(m_Value(X)))) && Arg0 == X)) {
+
+ if ((match(Arg0, m_OneUse(m_FNeg(m_Value(X)))) &&
+ match(Arg1, m_Specific(X))) ||
+ (match(Arg1, m_OneUse(m_FNeg(m_Value(X)))) &&
+ match(Arg0, m_Specific(X)))) {
Value *R = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, II);
- if (IID == Intrinsic::minimum || IID == Intrinsic::minnum)
+ if (IID == Intrinsic::minimum || IID == Intrinsic::minnum) {
R = Builder.CreateFNegFMF(R, II);
+ }
+
+ return replaceInstUsesWith(*II, R);
+ }
+
+ // No one-use. Only for max.
+ // TODO: Remove one-use limitation? That is obviously better for max,
+ // hence why we don't check for one-use for that. However,
+ // it would be an extra instruction for min (fnabs), but
+ // that is still likely better for analysis and codegen. If so, delete
+ // one-use version
+ if ((((match(Arg0, m_FNeg(m_Value(X)))) && match(Arg1, m_Specific(X))) ||
+ (match(Arg1, m_FNeg(m_Value(X))) && match(Arg0, m_Specific(X)))) &&
+ IID != Intrinsic::minimum && IID != Intrinsic::minnum) {
+ Value *R = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, X, II);
return replaceInstUsesWith(*II, R);
}
diff --git a/llvm/test/Transforms/InstCombine/maximum.ll b/llvm/test/Transforms/InstCombine/maximum.ll
index 82e4c8794c1c84..88cb2984510002 100644
--- a/llvm/test/Transforms/InstCombine/maximum.ll
+++ b/llvm/test/Transforms/InstCombine/maximum.ll
@@ -436,7 +436,7 @@ define float @negated_op_extra_use(float %x) {
; CHECK-LABEL: @negated_op_extra_use(
; CHECK-NEXT: [[NEGX:%.*]] = fneg float [[X:%.*]]
; CHECK-NEXT: call void @use(float [[NEGX]])
-; CHECK-NEXT: [[R:%.*]] = call float @llvm.maximum.f32(float [[NEGX]], float [[X]])
+; CHECK-NEXT: [[R:%.*]] = call float @llvm.fabs.f32(float [[X]])
; CHECK-NEXT: ret float [[R]]
;
%negx = fneg float %x
diff --git a/llvm/test/Transforms/InstCombine/maxnum.ll b/llvm/test/Transforms/InstCombine/maxnum.ll
index 87288b18cbcd9f..a1a2b096cb2745 100644
--- a/llvm/test/Transforms/InstCombine/maxnum.ll
+++ b/llvm/test/Transforms/InstCombine/maxnum.ll
@@ -458,7 +458,7 @@ define float @negated_op_extra_use(float %x) {
; CHECK-LABEL: @negated_op_extra_use(
; CHECK-NEXT: [[NEGX:%.*]] = fneg float [[X:%.*]]
; CHECK-NEXT: call void @use(float [[NEGX]])
-; CHECK-NEXT: [[R:%.*]] = call float @llvm.maxnum.f32(float [[NEGX]], float [[X]])
+; CHECK-NEXT: [[R:%.*]] = call float @llvm.fabs.f32(float [[X]])
; CHECK-NEXT: ret float [[R]]
;
%negx = fneg float %x
More information about the llvm-commits
mailing list