diff options
author | Tyker <tyker1@outlook.com> | 2020-04-24 19:46:18 +0200 |
---|---|---|
committer | Tyker <tyker1@outlook.com> | 2020-04-24 20:41:51 +0200 |
commit | 42431da89558881e4f7ea6c1bca9b5e7985d0f2c (patch) | |
tree | 94bd121cd61914ed5a57af663d68a47db145cf85 /llvm/lib/Analysis/ValueTracking.cpp | |
parent | c0fa447e02c4cd8c53c3ab03efa6391175e3d56e (diff) | |
download | llvm-42431da89558881e4f7ea6c1bca9b5e7985d0f2c.zip llvm-42431da89558881e4f7ea6c1bca9b5e7985d0f2c.tar.gz llvm-42431da89558881e4f7ea6c1bca9b5e7985d0f2c.tar.bz2 |
[AssumeBundles] Use assume bundles in isKnownNonZero
Summary: Use nonnull and dereferenceable from an assume bundle in isKnownNonZero
Reviewers: jdoerfert, nikic, lebedev.ri, reames, fhahn, sstefan1
Reviewed By: jdoerfert
Subscribers: fhahn, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D76149
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 056111b..9caa30b 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -24,6 +24,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/AssumeBundleQueries.h" #include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/GuardUtils.h" #include "llvm/Analysis/InstructionSimplify.h" @@ -688,6 +689,16 @@ static bool isKnownNonZeroFromAssume(const Value *V, const Query &Q) { return !TrueValues.contains(APInt::getNullValue(CI->getBitWidth())); }; + if (Q.CxtI && V->getType()->isPointerTy()) { + SmallVector<Attribute::AttrKind, 2> AttrKinds{Attribute::NonNull}; + if (!NullPointerIsDefined(Q.CxtI->getFunction(), + V->getType()->getPointerAddressSpace())) + AttrKinds.push_back(Attribute::Dereferenceable); + + if (getKnowledgeValidInContext(V, AttrKinds, Q.CxtI, Q.DT, Q.AC)) + return true; + } + for (auto &AssumeVH : Q.AC->assumptionsFor(V)) { if (!AssumeVH) continue; |