summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/SROA.cpp
diff options
context:
space:
mode:
authorDorit Nuzman <dorit.nuzman@intel.com>2016-09-20 07:50:49 +0000
committerDorit Nuzman <dorit.nuzman@intel.com>2016-09-20 07:50:49 +0000
commitd3686e5269daab6636160ff92c59feae4664552b (patch)
tree1eb979f94c72147b62f4f40d5657ad6944739c52 /llvm/lib/Transforms/Scalar/SROA.cpp
parent67882bd94e8c6887ad80c744be4843de2ded71a4 (diff)
downloadbcm5719-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.cpp12
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");
}
OpenPOWER on IntegriCloud