-
Notifications
You must be signed in to change notification settings - Fork 15.7k
InstCombine: Handle fmul by -0 case in SimplifyDemandedFPClass #174023
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: users/arsenm/instcombine/simplify-demanded-fpclass-fmul
Are you sure you want to change the base?
Conversation
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
@llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-llvm-support Author: Matt Arsenault (arsenm) ChangesThe fmul visitor handles this case as copysign and fneg. Full diff: https://github.com/llvm/llvm-project/pull/174023.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 9799ddacd7bd2..0b5854f169440 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2356,8 +2356,6 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
}
// TODO: Apply knowledge of no-infinity returns to sources.
-
- // TODO: Known -0, turn into copysign(y, fneg(x)) like visitFMul.
if (KnownLHS.isKnownNeverInfOrNaN() &&
KnownRHS.isKnownAlways(fcPosZero | fcNan)) {
// => copysign(+0, lhs)
@@ -2376,6 +2374,24 @@ Value *InstCombinerImpl::SimplifyDemandedUseFPClass(Value *V,
return Copysign;
}
+ if (KnownLHS.isKnownNeverInfOrNaN() &&
+ KnownRHS.isKnownAlways(fcNegZero | fcNan)) {
+ // => copysign(0, fneg(lhs))
+ // Note: Dropping canonicalize
+ Value *Copysign = Builder.CreateCopySign(Y, Builder.CreateFNegFMF(X, I));
+ Copysign->takeName(I);
+ return Copysign;
+ }
+
+ if (KnownLHS.isKnownAlways(fcNegZero | fcNan) &&
+ KnownRHS.isKnownNeverInfOrNaN()) {
+ // => copysign(+0, fneg(rhs))
+ // Note: Dropping canonicalize
+ Value *Copysign = Builder.CreateCopySign(X, Builder.CreateFNegFMF(Y, I));
+ Copysign->takeName(I);
+ return Copysign;
+ }
+
Type *EltTy = VTy->getScalarType();
DenormalMode Mode = F.getDenormalMode(EltTy->getFltSemantics());
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
index 7d0b8ebae20cc..cb83fdc3e7a6b 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass-fmul.ll
@@ -941,7 +941,8 @@ define nofpclass(ninf) float @ret_ninf__fmul_nnan_unknown__zero(float %unknown)
define nofpclass(snan) float @known__nzero_or_nan__fmul__not_inf_or_nan(float nofpclass(inf sub norm pzero) %nzero.or.nan, float nofpclass(inf nan) %not.inf.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @known__nzero_or_nan__fmul__not_inf_or_nan(
; CHECK-SAME: float nofpclass(inf pzero sub norm) [[NZERO_OR_NAN:%.*]], float nofpclass(nan inf) [[NOT_INF_OR_NAN:%.*]]) {
-; CHECK-NEXT: [[MUL:%.*]] = fmul contract float [[NZERO_OR_NAN]], [[NOT_INF_OR_NAN]]
+; CHECK-NEXT: [[TMP1:%.*]] = fneg contract float [[NOT_INF_OR_NAN]]
+; CHECK-NEXT: [[MUL:%.*]] = call float @llvm.copysign.f32(float [[NZERO_OR_NAN]], float [[TMP1]])
; CHECK-NEXT: ret float [[MUL]]
;
%mul = fmul contract float %nzero.or.nan, %not.inf.or.nan
@@ -952,7 +953,8 @@ define nofpclass(snan) float @known__nzero_or_nan__fmul__not_inf_or_nan(float no
define nofpclass(snan) float @known__not_inf_or_nan__fmul__nzero_or_nan(float nofpclass(inf nan) %not.inf.or.nan, float nofpclass(inf sub norm pzero) %nzero.or.nan) {
; CHECK-LABEL: define nofpclass(snan) float @known__not_inf_or_nan__fmul__nzero_or_nan(
; CHECK-SAME: float nofpclass(nan inf) [[NOT_INF_OR_NAN:%.*]], float nofpclass(inf pzero sub norm) [[NZERO_OR_NAN:%.*]]) {
-; CHECK-NEXT: [[MUL:%.*]] = fmul contract float [[NOT_INF_OR_NAN]], [[NZERO_OR_NAN]]
+; CHECK-NEXT: [[TMP1:%.*]] = fneg contract float [[NOT_INF_OR_NAN]]
+; CHECK-NEXT: [[MUL:%.*]] = call float @llvm.copysign.f32(float [[NZERO_OR_NAN]], float [[TMP1]])
; CHECK-NEXT: ret float [[MUL]]
;
%mul = fmul contract float %not.inf.or.nan, %nzero.or.nan
|
ff4c662 to
b2471d5
Compare
171dd91 to
f2f9302
Compare
dtcxzyw
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
The fmul visitor handles this case as copysign and fneg.
b2471d5 to
45afbb3
Compare
f2f9302 to
ec17cc4
Compare

The fmul visitor handles this case as copysign and fneg.