aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-04-10 15:41:46 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-04-14 17:41:26 -0400
commit656b52a6c61e15dfbd5969417d66fcaf0e730ce1 (patch)
treebba0ecc7dfb215ada25d10d81ace530783efa175 /llvm/lib/Analysis/ValueTracking.cpp
parent2b88298c2ab221228744ca8dba70c2d3bcff593b (diff)
downloadllvm-656b52a6c61e15dfbd5969417d66fcaf0e730ce1.zip
llvm-656b52a6c61e15dfbd5969417d66fcaf0e730ce1.tar.gz
llvm-656b52a6c61e15dfbd5969417d66fcaf0e730ce1.tar.bz2
ValueTracking: Handle non-splat vectors in computeKnownFPClass
Avoids some regressions when the implementation of isKnownNeverNaN is replaced with computeKnownFPClass.
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index b4ff594..51f8894 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4362,12 +4362,38 @@ void computeKnownFPClass(const Value *V, const APInt &DemandedElts,
assert(Depth <= MaxAnalysisRecursionDepth && "Limit Search Depth");
- const APFloat *C;
- if (match(V, m_APFloat(C))) {
- // We know all of the classes for a scalar constant or a splat vector
- // constant!
- Known.KnownFPClasses = C->classify();
- Known.SignBit = C->isNegative();
+ if (auto *CFP = dyn_cast_or_null<ConstantFP>(V)) {
+ Known.KnownFPClasses = CFP->getValueAPF().classify();
+ Known.SignBit = CFP->isNegative();
+ return;
+ }
+
+ // Try to handle fixed width vector constants
+ auto *VFVTy = dyn_cast<FixedVectorType>(V->getType());
+ const Constant *CV = dyn_cast<Constant>(V);
+ if (VFVTy && CV) {
+ Known.KnownFPClasses = fcNone;
+
+ // For vectors, verify that each element is not NaN.
+ unsigned NumElts = VFVTy->getNumElements();
+ for (unsigned i = 0; i != NumElts; ++i) {
+ Constant *Elt = CV->getAggregateElement(i);
+ if (!Elt) {
+ Known = KnownFPClass();
+ return;
+ }
+ if (isa<UndefValue>(Elt))
+ continue;
+ auto *CElt = dyn_cast<ConstantFP>(Elt);
+ if (!CElt) {
+ Known = KnownFPClass();
+ return;
+ }
+
+ KnownFPClass KnownElt{CElt->getValueAPF().classify(), CElt->isNegative()};
+ Known |= KnownElt;
+ }
+
return;
}