diff options
author | Craig Topper <craig.topper@intel.com> | 2018-02-26 22:33:17 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-02-26 22:33:17 +0000 |
commit | 69c8972fd1dd4beb75421dd32110d2f0e1cb3a5f (patch) | |
tree | 83b8d25a8ecfd8f8510b421bb43134bad6392860 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 79c23eec04499933479874c0b06bc8d51914bde4 (diff) | |
download | llvm-69c8972fd1dd4beb75421dd32110d2f0e1cb3a5f.zip llvm-69c8972fd1dd4beb75421dd32110d2f0e1cb3a5f.tar.gz llvm-69c8972fd1dd4beb75421dd32110d2f0e1cb3a5f.tar.bz2 |
[ValueTracking] Teach cannotBeOrderedLessThanZeroImpl to handle vector constants.
Summary: This allows vector fabs to be removed in more cases.
Reviewers: spatel, arsenm, RKSimon
Reviewed By: spatel
Subscribers: wdng, llvm-commits
Differential Revision: https://reviews.llvm.org/D43739
llvm-svn: 326138
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index e425599..a1ec9df 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2728,6 +2728,24 @@ static bool cannotBeOrderedLessThanZeroImpl(const Value *V, (!SignBitOnly && CFP->getValueAPF().isZero()); } + // Handle vector of constants. + if (auto *CV = dyn_cast<Constant>(V)) { + if (CV->getType()->isVectorTy()) { + unsigned NumElts = CV->getType()->getVectorNumElements(); + for (unsigned i = 0; i != NumElts; ++i) { + auto *CFP = dyn_cast_or_null<ConstantFP>(CV->getAggregateElement(i)); + if (!CFP) + return false; + if (CFP->getValueAPF().isNegative() && + (SignBitOnly || !CFP->getValueAPF().isZero())) + return false; + } + + // All non-negative ConstantFPs. + return true; + } + } + if (Depth == MaxDepth) return false; // Limit search depth. |