diff options
author | Dorit Nuzman <dorit.nuzman@intel.com> | 2016-09-20 07:50:49 +0000 |
---|---|---|
committer | Dorit Nuzman <dorit.nuzman@intel.com> | 2016-09-20 07:50:49 +0000 |
commit | d3686e5269daab6636160ff92c59feae4664552b (patch) | |
tree | 1eb979f94c72147b62f4f40d5657ad6944739c52 /llvm/lib/Transforms/Scalar/SROA.cpp | |
parent | 67882bd94e8c6887ad80c744be4843de2ded71a4 (diff) | |
download | bcm5719-llvm-d3686e5269daab6636160ff92c59feae4664552b.tar.gz bcm5719-llvm-d3686e5269daab6636160ff92c59feae4664552b.zip |
[SROA] Preserve llvm.mem.parallel_loop_access metadata.
SROA doesn't preserve the llvm.mem.parallel_loop_access metadata when it
transforms loads/stores. This patch fixes a couple occurences of this
issue.
(Partially addresses PR28981).
Differential Revision: https://reviews.llvm.org/D23549
llvm-svn: 281960
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SROA.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 123c1767f3e..83d04272e22 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -2482,8 +2482,10 @@ private: } V = convertValue(DL, IRB, V, NewAllocaTy); StoreInst *Store = IRB.CreateAlignedStore(V, &NewAI, NewAI.getAlignment()); + auto LoopParMD = + makeArrayRef((unsigned)LLVMContext::MD_mem_parallel_loop_access); + Store->copyMetadata(SI, LoopParMD); Pass.DeadInsts.insert(&SI); - (void)Store; DEBUG(dbgs() << " to: " << *Store << "\n"); return true; } @@ -2545,6 +2547,9 @@ private: NewSI = IRB.CreateAlignedStore(V, NewPtr, getSliceAlign(V->getType()), SI.isVolatile()); } + auto LoopParMD = + makeArrayRef((unsigned)LLVMContext::MD_mem_parallel_loop_access); + NewSI->copyMetadata(SI, LoopParMD); if (SI.isVolatile()) NewSI->setAtomic(SI.getOrdering(), SI.getSynchScope()); Pass.DeadInsts.insert(&SI); @@ -3560,6 +3565,8 @@ bool SROA::presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS) { uint64_t PartOffset = 0, PartSize = Offsets.Splits.front(); int Idx = 0, Size = Offsets.Splits.size(); + auto LoopParMD = + makeArrayRef((unsigned)LLVMContext::MD_mem_parallel_loop_access); for (;;) { auto *PartTy = Type::getIntNTy(Ty->getContext(), PartSize * 8); auto *PartPtrTy = PartTy->getPointerTo(LI->getPointerAddressSpace()); @@ -3569,6 +3576,7 @@ bool SROA::presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS) { PartPtrTy, BasePtr->getName() + "."), getAdjustedAlignment(LI, PartOffset, DL), /*IsVolatile*/ false, LI->getName()); + PLoad->copyMetadata(*LI, LoopParMD); // Append this load onto the list of split loads so we can find it later // to rewrite the stores. @@ -3621,7 +3629,7 @@ bool SROA::presplitLoadsAndStores(AllocaInst &AI, AllocaSlices &AS) { APInt(DL.getPointerSizeInBits(), PartOffset), PartPtrTy, StoreBasePtr->getName() + "."), getAdjustedAlignment(SI, PartOffset, DL), /*IsVolatile*/ false); - (void)PStore; + PStore->copyMetadata(*LI, LoopParMD); DEBUG(dbgs() << " +" << PartOffset << ":" << *PStore << "\n"); } |