From: George Burgess IV Date: Sun, 23 Dec 2018 03:36:44 +0000 (+0000) Subject: [MemoryLocation] Use LocationSize instead of ints; NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fdf69948e5804ce62c75ec722047d47317b754b4;p=llvm [MemoryLocation] Use LocationSize instead of ints; NFC Trying to keep these patches super small so they're easily post-commit verifiable, as requested in D44748. This one sadly isn't *super* small, but all of the changes here are either to: - libfuncs that are passed a constant size (memcpy, memset, ...) - instructions that store/load a constant size So they have to be precise git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350017 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/MemoryLocation.cpp b/lib/Analysis/MemoryLocation.cpp index c0605f6ad37..c15ed680e0a 100644 --- a/lib/Analysis/MemoryLocation.cpp +++ b/lib/Analysis/MemoryLocation.cpp @@ -37,8 +37,9 @@ MemoryLocation MemoryLocation::get(const LoadInst *LI) { LI->getAAMetadata(AATags); const auto &DL = LI->getModule()->getDataLayout(); - return MemoryLocation(LI->getPointerOperand(), - DL.getTypeStoreSize(LI->getType()), AATags); + return MemoryLocation( + LI->getPointerOperand(), + LocationSize::precise(DL.getTypeStoreSize(LI->getType())), AATags); } MemoryLocation MemoryLocation::get(const StoreInst *SI) { @@ -47,7 +48,8 @@ MemoryLocation MemoryLocation::get(const StoreInst *SI) { const auto &DL = SI->getModule()->getDataLayout(); return MemoryLocation(SI->getPointerOperand(), - DL.getTypeStoreSize(SI->getValueOperand()->getType()), + LocationSize::precise(DL.getTypeStoreSize( + SI->getValueOperand()->getType())), AATags); } @@ -64,9 +66,10 @@ MemoryLocation MemoryLocation::get(const AtomicCmpXchgInst *CXI) { CXI->getAAMetadata(AATags); const auto &DL = CXI->getModule()->getDataLayout(); - return MemoryLocation( - CXI->getPointerOperand(), - DL.getTypeStoreSize(CXI->getCompareOperand()->getType()), AATags); + return MemoryLocation(CXI->getPointerOperand(), + LocationSize::precise(DL.getTypeStoreSize( + CXI->getCompareOperand()->getType())), + AATags); } MemoryLocation MemoryLocation::get(const AtomicRMWInst *RMWI) { @@ -75,7 +78,8 @@ MemoryLocation MemoryLocation::get(const AtomicRMWInst *RMWI) { const auto &DL = RMWI->getModule()->getDataLayout(); return MemoryLocation(RMWI->getPointerOperand(), - DL.getTypeStoreSize(RMWI->getValOperand()->getType()), + LocationSize::precise(DL.getTypeStoreSize( + RMWI->getValOperand()->getType())), AATags); } @@ -88,9 +92,9 @@ MemoryLocation MemoryLocation::getForSource(const AtomicMemTransferInst *MTI) { } MemoryLocation MemoryLocation::getForSource(const AnyMemTransferInst *MTI) { - uint64_t Size = MemoryLocation::UnknownSize; + auto Size = LocationSize::unknown(); if (ConstantInt *C = dyn_cast(MTI->getLength())) - Size = C->getValue().getZExtValue(); + Size = LocationSize::precise(C->getValue().getZExtValue()); // memcpy/memmove can have AA tags. For memcpy, they apply // to both the source and the destination. @@ -109,9 +113,9 @@ MemoryLocation MemoryLocation::getForDest(const AtomicMemIntrinsic *MI) { } MemoryLocation MemoryLocation::getForDest(const AnyMemIntrinsic *MI) { - uint64_t Size = MemoryLocation::UnknownSize; + auto Size = LocationSize::unknown(); if (ConstantInt *C = dyn_cast(MI->getLength())) - Size = C->getValue().getZExtValue(); + Size = LocationSize::precise(C->getValue().getZExtValue()); // memcpy/memmove can have AA tags. For memcpy, they apply // to both the source and the destination. @@ -141,7 +145,8 @@ MemoryLocation MemoryLocation::getForArgument(ImmutableCallSite CS, assert((ArgIdx == 0 || ArgIdx == 1) && "Invalid argument index for memory intrinsic"); if (ConstantInt *LenCI = dyn_cast(II->getArgOperand(2))) - return MemoryLocation(Arg, LenCI->getZExtValue(), AATags); + return MemoryLocation(Arg, LocationSize::precise(LenCI->getZExtValue()), + AATags); break; case Intrinsic::lifetime_start: @@ -149,27 +154,37 @@ MemoryLocation MemoryLocation::getForArgument(ImmutableCallSite CS, case Intrinsic::invariant_start: assert(ArgIdx == 1 && "Invalid argument index"); return MemoryLocation( - Arg, cast(II->getArgOperand(0))->getZExtValue(), AATags); + Arg, + LocationSize::precise( + cast(II->getArgOperand(0))->getZExtValue()), + AATags); case Intrinsic::invariant_end: // The first argument to an invariant.end is a "descriptor" type (e.g. a // pointer to a empty struct) which is never actually dereferenced. if (ArgIdx == 0) - return MemoryLocation(Arg, 0, AATags); + return MemoryLocation(Arg, LocationSize::precise(0), AATags); assert(ArgIdx == 2 && "Invalid argument index"); return MemoryLocation( - Arg, cast(II->getArgOperand(1))->getZExtValue(), AATags); + Arg, + LocationSize::precise( + cast(II->getArgOperand(1))->getZExtValue()), + AATags); case Intrinsic::arm_neon_vld1: assert(ArgIdx == 0 && "Invalid argument index"); // LLVM's vld1 and vst1 intrinsics currently only support a single // vector register. - return MemoryLocation(Arg, DL.getTypeStoreSize(II->getType()), AATags); + return MemoryLocation( + Arg, LocationSize::precise(DL.getTypeStoreSize(II->getType())), + AATags); case Intrinsic::arm_neon_vst1: assert(ArgIdx == 0 && "Invalid argument index"); - return MemoryLocation( - Arg, DL.getTypeStoreSize(II->getArgOperand(1)->getType()), AATags); + return MemoryLocation(Arg, + LocationSize::precise(DL.getTypeStoreSize( + II->getArgOperand(1)->getType())), + AATags); } } @@ -184,9 +199,10 @@ MemoryLocation MemoryLocation::getForArgument(ImmutableCallSite CS, assert((ArgIdx == 0 || ArgIdx == 1) && "Invalid argument index for memset_pattern16"); if (ArgIdx == 1) - return MemoryLocation(Arg, 16, AATags); + return MemoryLocation(Arg, LocationSize::precise(16), AATags); if (const ConstantInt *LenCI = dyn_cast(CS.getArgument(2))) - return MemoryLocation(Arg, LenCI->getZExtValue(), AATags); + return MemoryLocation(Arg, LocationSize::precise(LenCI->getZExtValue()), + AATags); } // FIXME: Handle memset_pattern4 and memset_pattern8 also.