llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-support

Author: Matt Arsenault (arsenm)

<details>
<summary>Changes</summary>

If the only sign bit difference is for 0, fold through the source.

---
Full diff: https://github.com/llvm/llvm-project/pull/176916.diff


2 Files Affected:

- (modified) llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
(+31-1) 
- (modified) llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll 
(+2-4) 


``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp 
b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
index 943ac31a7b306..9212cfd8fd28d 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp
@@ -2081,6 +2081,32 @@ static Value 
*simplifyDemandedFPClassFnegFabs(KnownFPClass &Known, Value *Src,
   return nullptr;
 }
 
+static Value *simplifyDemandedFPClassCopysignMag(Value *MagSrc,
+                                                 FPClassTest DemandedMask,
+                                                 KnownFPClass KnownSrc,
+                                                 bool NSZ) {
+  if (NSZ) {
+    constexpr FPClassTest NegOrZero = fcNegative | fcPosZero;
+    constexpr FPClassTest PosOrZero = fcPositive | fcNegZero;
+
+    if ((DemandedMask & ~NegOrZero) == fcNone &&
+        KnownSrc.isKnownNever(KnownFPClass::OrderedGreaterThanZeroMask | 
fcNan))
+      return MagSrc;
+
+    if ((DemandedMask & ~PosOrZero) == fcNone &&
+        KnownSrc.isKnownNever(KnownFPClass::OrderedLessThanZeroMask | fcNan))
+      return MagSrc;
+  } else {
+    if ((DemandedMask & ~fcNegative) == fcNone && KnownSrc.SignBit == true)
+      return MagSrc;
+
+    if ((DemandedMask & ~fcPositive) == fcNone && KnownSrc.SignBit == false)
+      return MagSrc;
+  }
+
+  return nullptr;
+}
+
 static Value *
 simplifyDemandedFPClassMinMax(KnownFPClass &Known, Intrinsic::ID IID,
                               const CallInst *CI, FPClassTest DemandedMask,
@@ -2574,7 +2600,7 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
     case Intrinsic::copysign: {
       // Flip on more potentially demanded classes
       const FPClassTest DemandedMaskAnySign = llvm::unknown_sign(DemandedMask);
-      if (SimplifyDemandedFPClass(I, 0, DemandedMaskAnySign, Known, Depth + 1))
+      if (SimplifyDemandedFPClass(CI, 0, DemandedMaskAnySign, Known, Depth + 
1))
         return I;
 
       if ((DemandedMask & fcNegative) == DemandedMask) {
@@ -2589,6 +2615,10 @@ Value 
*InstCombinerImpl::SimplifyDemandedUseFPClass(Instruction *I,
         return I;
       }
 
+      if (Value *Simplified = simplifyDemandedFPClassCopysignMag(
+              CI->getArgOperand(0), DemandedMask, Known, FMF.noSignedZeros()))
+        return Simplified;
+
       KnownFPClass KnownSign = computeKnownFPClass(CI->getArgOperand(1),
                                                    fcAllFlags, CxtI, Depth + 
1);
 
diff --git a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll 
b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
index 91e55e2fb2645..45a50f04e1b0f 100644
--- a/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
+++ b/llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll
@@ -2273,8 +2273,7 @@ define nofpclass(nan ninf nnorm nsub) float 
@ret_only_positive_or_zero__copysign
 define nofpclass(nan ninf nnorm nsub) float 
@ret_only_positive_or_zero__copysign_nsz_src_known_positive__sign_unknown(float 
nofpclass(nan ninf nnorm nsub) %always.positive.or.zero, float %unknown) {
 ; CHECK-LABEL: define nofpclass(nan ninf nsub nnorm) float 
@ret_only_positive_or_zero__copysign_nsz_src_known_positive__sign_unknown
 ; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) 
[[ALWAYS_POSITIVE_OR_ZERO:%.*]], float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    [[COPYSIGN:%.*]] = call nsz float @llvm.copysign.f32(float 
[[ALWAYS_POSITIVE_OR_ZERO]], float [[UNKNOWN]])
-; CHECK-NEXT:    ret float [[COPYSIGN]]
+; CHECK-NEXT:    ret float [[ALWAYS_POSITIVE_OR_ZERO]]
 ;
   %copysign = call nsz float @llvm.copysign.f32(float 
%always.positive.or.zero, float %unknown)
   ret float %copysign
@@ -2307,8 +2306,7 @@ define nofpclass(nan pinf pnorm psub) float 
@ret_only_negative_or_pzero__copysig
 define nofpclass(nan pinf pnorm psub) float 
@ret_only_negative_or_pzero__copysign_nsz_src_known_negative__sign_unknown(float
 nofpclass(nan pinf pnorm psub) %always.negative.or.zero, float %unknown) {
 ; CHECK-LABEL: define nofpclass(nan pinf psub pnorm) float 
@ret_only_negative_or_pzero__copysign_nsz_src_known_negative__sign_unknown
 ; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) 
[[ALWAYS_NEGATIVE_OR_ZERO:%.*]], float [[UNKNOWN:%.*]]) {
-; CHECK-NEXT:    [[COPYSIGN:%.*]] = call nsz float @llvm.copysign.f32(float 
[[ALWAYS_NEGATIVE_OR_ZERO]], float [[UNKNOWN]])
-; CHECK-NEXT:    ret float [[COPYSIGN]]
+; CHECK-NEXT:    ret float [[ALWAYS_NEGATIVE_OR_ZERO]]
 ;
   %copysign = call nsz float @llvm.copysign.f32(float 
%always.negative.or.zero, float %unknown)
   ret float %copysign

``````````

</details>


https://github.com/llvm/llvm-project/pull/176916
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to