diff options
| author | George Burgess IV <george.burgess.iv@gmail.com> | 2018-12-23 03:36:44 +0000 |
|---|---|---|
| committer | George Burgess IV <george.burgess.iv@gmail.com> | 2018-12-23 03:36:44 +0000 |
| commit | 69952979da5bc001c071506c64fbbe95fc4f181a (patch) | |
| tree | 9701928d8643769812a3188b48829e7f00603741 /llvm/lib/Analysis | |
| parent | 8c5413f3f71be700772cb8a2f7028d0eb1e3dd51 (diff) | |
| download | bcm5719-llvm-69952979da5bc001c071506c64fbbe95fc4f181a.tar.gz bcm5719-llvm-69952979da5bc001c071506c64fbbe95fc4f181a.zip | |
[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
llvm-svn: 350017
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/MemoryLocation.cpp | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/llvm/lib/Analysis/MemoryLocation.cpp b/llvm/lib/Analysis/MemoryLocation.cpp index c0605f6ad37..c15ed680e0a 100644 --- a/llvm/lib/Analysis/MemoryLocation.cpp +++ b/llvm/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<ConstantInt>(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<ConstantInt>(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<ConstantInt>(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<ConstantInt>(II->getArgOperand(0))->getZExtValue(), AATags); + Arg, + LocationSize::precise( + cast<ConstantInt>(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<ConstantInt>(II->getArgOperand(1))->getZExtValue(), AATags); + Arg, + LocationSize::precise( + cast<ConstantInt>(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<ConstantInt>(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. |

