diff options
author | David Bolvansky <david.bolvansky@gmail.com> | 2019-08-14 17:15:20 +0000 |
---|---|---|
committer | David Bolvansky <david.bolvansky@gmail.com> | 2019-08-14 17:15:20 +0000 |
commit | f94460d4b64c3748eab0334262b27d756dade84e (patch) | |
tree | 5333375e7b504389dc838be27095e0479e9ed72f /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | |
parent | 92541e359e4bdd2e9a149a2bb7d1519f77244655 (diff) | |
download | bcm5719-llvm-f94460d4b64c3748eab0334262b27d756dade84e.tar.gz bcm5719-llvm-f94460d4b64c3748eab0334262b27d756dade84e.zip |
[SLC] Dereferenceable annonation - handle valid null pointers
Reviewers: jdoerfert, reames
Reviewed By: jdoerfert
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66161
llvm-svn: 368884
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index ef4cc227222..2bee94cade0 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -189,15 +189,22 @@ static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len, static void annotateDereferenceableBytes(CallInst *CI, ArrayRef<unsigned> ArgNos, uint64_t DereferenceableBytes) { + const Function *F = CI->getFunction(); + if (!F) + return; for (unsigned ArgNo : ArgNos) { - uint64_t DerefBytes = std::max( - CI->getDereferenceableOrNullBytes(ArgNo + AttributeList::FirstArgIndex), - DereferenceableBytes); + uint64_t DerefBytes = DereferenceableBytes; + unsigned AS = CI->getArgOperand(ArgNo)->getType()->getPointerAddressSpace(); + if (!llvm::NullPointerIsDefined(F, AS)) + DerefBytes = std::max(CI->getDereferenceableOrNullBytes( + ArgNo + AttributeList::FirstArgIndex), + DereferenceableBytes); if (CI->getDereferenceableBytes(ArgNo + AttributeList::FirstArgIndex) < DerefBytes) { CI->removeParamAttr(ArgNo, Attribute::Dereferenceable); - CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); + if (!llvm::NullPointerIsDefined(F, AS)) + CI->removeParamAttr(ArgNo, Attribute::DereferenceableOrNull); CI->addParamAttr(ArgNo, Attribute::getWithDereferenceableBytes( CI->getContext(), DerefBytes)); } |