aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-04-08 09:21:31 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-04-12 06:48:58 -0400
commit6aca400986d5c394624759eaed1e93f13d0cbcbb (patch)
tree1d19fbec6a29dfd840c8ad1eaf96ecddc0afd221 /llvm/lib/Analysis/ValueTracking.cpp
parenteb8e43a2a154b97cdf66764a2410be9ffc2387ab (diff)
downloadllvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.zip
llvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.tar.gz
llvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.tar.bz2
ValueTracking: Handle no-nan check for computeKnownFPClass for fadd/fsub
Copy the logic from isKnownNeverNaN for fadd/fsub.
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 879015b..af82276 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4439,6 +4439,25 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
break;
}
+ case Instruction::FAdd:
+ case Instruction::FSub: {
+ KnownFPClass KnownLHS, KnownRHS;
+ computeKnownFPClass(Op->getOperand(1), DemandedElts, fcNan | fcInf,
+ KnownRHS, Depth + 1, Q, TLI);
+ if (KnownRHS.isKnownNeverNaN()) {
+ // RHS is canonically cheaper to compute. Skip inspecting the LHS if
+ // there's no point.
+ computeKnownFPClass(Op->getOperand(0), DemandedElts, fcNan | fcInf,
+ KnownLHS, Depth + 1, Q, TLI);
+ // Adding positive and negative infinity produces NaN.
+ // TODO: Check sign of infinities.
+ if (KnownLHS.isKnownNeverNaN() &&
+ (KnownLHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverInfinity()))
+ Known.knownNot(fcNan);
+ }
+
+ break;
+ }
case Instruction::SIToFP:
case Instruction::UIToFP: {
// Cannot produce nan