diff options
author | Dhruv Chawla <44582521+dc03@users.noreply.github.com> | 2023-07-24 22:08:26 +0530 |
---|---|---|
committer | Dhruv Chawla <44582521+dc03@users.noreply.github.com> | 2023-07-26 13:50:38 +0530 |
commit | d899dc5296c751a60afbe3eae2039dd1b326a499 (patch) | |
tree | a1ae3ac5ca164129ff9f455b01bd567f6f5ab26f /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 5a9584860446e717e061989486020846d486f85e (diff) | |
download | llvm-d899dc5296c751a60afbe3eae2039dd1b326a499.zip llvm-d899dc5296c751a60afbe3eae2039dd1b326a499.tar.gz llvm-d899dc5296c751a60afbe3eae2039dd1b326a499.tar.bz2 |
[NFC][ValueTracking]: Move some code from isKnownNonZero to isKnownNonZeroFromOperator
There is some pointer simplification code originally from isKnownNonNull
that is now better suited to be in isKnownNonZeroFromOperator.
Differential Revision: https://reviews.llvm.org/D156141
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 5d52685..e335d7c 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2454,6 +2454,9 @@ static bool isKnownNonZeroFromOperator(const Operator *I, unsigned Depth, const SimplifyQuery &Q) { unsigned BitWidth = getBitWidth(I->getType()->getScalarType(), Q.DL); switch (I->getOpcode()) { + case Instruction::Alloca: + // Alloca never returns null, malloc might. + return I->getType()->getPointerAddressSpace() == 0; case Instruction::GetElementPtr: if (I->getType()->isPointerTy()) return isGEPKnownNonNull(cast<GEPOperator>(I), Depth, Q); @@ -2688,6 +2691,15 @@ static bool isKnownNonZeroFromOperator(const Operator *I, // handled in isKnownNonZero. return false; case Instruction::Call: + case Instruction::Invoke: + if (I->getType()->isPointerTy()) { + const auto *Call = cast<CallBase>(I); + if (Call->isReturnNonNull()) + return true; + if (const auto *RP = getArgumentAliasingToReturnedPointer(Call, true)) + return isKnownNonZero(RP, Depth, Q); + } + if (auto *II = dyn_cast<IntrinsicInst>(I)) { switch (II->getIntrinsicID()) { case Intrinsic::sshl_sat: @@ -2838,10 +2850,6 @@ bool isKnownNonZero(const Value *V, const APInt &DemandedElts, unsigned Depth, // Check for pointer simplifications. if (PointerType *PtrTy = dyn_cast<PointerType>(V->getType())) { - // Alloca never returns null, malloc might. - if (isa<AllocaInst>(V) && PtrTy->getAddressSpace() == 0) - return true; - // A byval, inalloca may not be null in a non-default addres space. A // nonnull argument is assumed never 0. if (const Argument *A = dyn_cast<Argument>(V)) { @@ -2850,13 +2858,6 @@ bool isKnownNonZero(const Value *V, const APInt &DemandedElts, unsigned Depth, A->hasNonNullAttr())) return true; } - - if (const auto *Call = dyn_cast<CallBase>(V)) { - if (Call->isReturnNonNull()) - return true; - if (const auto *RP = getArgumentAliasingToReturnedPointer(Call, true)) - return isKnownNonZero(RP, Depth, Q); - } } if (const auto *I = dyn_cast<Operator>(V)) |