aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-04-09 07:16:34 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-04-24 14:29:35 -0400
commita070dbfd14d6154b4d3f1bbd55d901429ad8ac79 (patch)
treed7b747670f761ed71b9b060a0be42b38545140a3 /llvm/lib/Analysis/ValueTracking.cpp
parent94df66b7bf48d365623c576f02b8ecb9b140a0a4 (diff)
downloadllvm-a070dbfd14d6154b4d3f1bbd55d901429ad8ac79.zip
llvm-a070dbfd14d6154b4d3f1bbd55d901429ad8ac79.tar.gz
llvm-a070dbfd14d6154b4d3f1bbd55d901429ad8ac79.tar.bz2
ValueTracking: Implement computeKnownFPClass for fma/fmuladd
Copy handling from CannotBeOrderedLessThanZero
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index b2d1406..6e7b807 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4546,6 +4546,27 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
Known.copysign(KnownSign);
break;
}
+ case Intrinsic::fma:
+ case Intrinsic::fmuladd: {
+ if ((InterestedClasses & fcNegative) == fcNone)
+ break;
+
+ if (II->getArgOperand(0) != II->getArgOperand(1))
+ break;
+
+ // The multiply cannot be -0 and therefore the add can't be -0
+ Known.knownNot(fcNegZero);
+
+ // x * x + y is non-negative if y is non-negative.
+ KnownFPClass KnownAddend;
+ computeKnownFPClass(II->getArgOperand(2), DemandedElts,
+ InterestedClasses, KnownAddend, Depth + 1, Q, TLI);
+
+ // TODO: Known sign bit with no nans
+ if (KnownAddend.cannotBeOrderedLessThanZero())
+ Known.knownNot(fcNegative);
+ break;
+ }
case Intrinsic::sin:
case Intrinsic::cos: {
// Return NaN on infinite inputs.