diff options
Diffstat (limited to 'llvm/lib/Analysis/MemoryLocation.cpp')
-rw-r--r-- | llvm/lib/Analysis/MemoryLocation.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp index c8daab7a..28a2640 100644 --- a/llvm/lib/Analysis/MemoryLocation.cpp +++ b/llvm/lib/Analysis/MemoryLocation.cpp @@ -190,7 +190,21 @@ MemoryLocation MemoryLocation::getForArgument(const CallBase *Call, return MemoryLocation::getAfter(Arg, AATags); case Intrinsic::lifetime_start: - case Intrinsic::lifetime_end: + case Intrinsic::lifetime_end: { + assert(ArgIdx == 1 && "Invalid argument index"); + auto *AI = dyn_cast<AllocaInst>(Arg); + if (!AI) + // lifetime of poison value. + return MemoryLocation::getBeforeOrAfter(Arg); + + std::optional<TypeSize> AllocSize = + AI->getAllocationSize(II->getDataLayout()); + return MemoryLocation(Arg, + AllocSize ? LocationSize::precise(*AllocSize) + : LocationSize::afterPointer(), + AATags); + } + case Intrinsic::invariant_start: assert(ArgIdx == 1 && "Invalid argument index"); return MemoryLocation( |