diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-01 13:22:02 +0000 | 
| commit | 9df3605dea17e84f8183581f6103bd0c79e2a606 (patch) | |
| tree | 70a2f36ce9eb9bb213603cd7f2f120af53fc176f /lib/Transforms/Scalar/SROA.cpp | |
| parent | 08bbd35a80bf7765fe0d3043f9eb5a2f2786b649 (diff) | |
Diffstat (limited to 'lib/Transforms/Scalar/SROA.cpp')
| -rw-r--r-- | lib/Transforms/Scalar/SROA.cpp | 20 | 
1 files changed, 16 insertions, 4 deletions
| diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 80fbbeb6829b..4729f4ef5956 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -2402,9 +2402,20 @@ private:        if (LI.isVolatile())          NewLI->setAtomic(LI.getOrdering(), LI.getSynchScope()); +      // Any !nonnull metadata or !range metadata on the old load is also valid +      // on the new load. This is even true in some cases even when the loads +      // are different types, for example by mapping !nonnull metadata to +      // !range metadata by modeling the null pointer constant converted to the +      // integer type. +      // FIXME: Add support for range metadata here. Currently the utilities +      // for this don't propagate range metadata in trivial cases from one +      // integer load to another, don't handle non-addrspace-0 null pointers +      // correctly, and don't have any support for mapping ranges as the +      // integer type becomes winder or narrower. +      if (MDNode *N = LI.getMetadata(LLVMContext::MD_nonnull)) +        copyNonnullMetadata(LI, N, *NewLI); +        // Try to preserve nonnull metadata -      if (TargetTy->isPointerTy()) -        NewLI->copyMetadata(LI, LLVMContext::MD_nonnull);        V = NewLI;        // If this is an integer load past the end of the slice (which means the @@ -3580,10 +3591,11 @@ bool SROA::presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS) {      int Idx = 0, Size = Offsets.Splits.size();      for (;;) {        auto *PartTy = Type::getIntNTy(Ty->getContext(), PartSize * 8); -      auto *PartPtrTy = PartTy->getPointerTo(LI->getPointerAddressSpace()); +      auto AS = LI->getPointerAddressSpace(); +      auto *PartPtrTy = PartTy->getPointerTo(AS);        LoadInst *PLoad = IRB.CreateAlignedLoad(            getAdjustedPtr(IRB, DL, BasePtr, -                         APInt(DL.getPointerSizeInBits(), PartOffset), +                         APInt(DL.getPointerSizeInBits(AS), PartOffset),                           PartPtrTy, BasePtr->getName() + "."),            getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false,            LI->getName()); | 
