diff options
| author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-01-19 00:17:21 +0000 |
|---|---|---|
| committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2016-01-19 00:17:21 +0000 |
| commit | 370cf00c9f685c70ed083b228f4a8e2ea42c294e (patch) | |
| tree | 29a8ac70bc448d8a28c46a1b38431cc459a2a5e0 /polly/lib/CodeGen/IslNodeBuilder.cpp | |
| parent | 3a6a0a01099536d9f2c3c822c3bf59954b277a58 (diff) | |
| download | bcm5719-llvm-370cf00c9f685c70ed083b228f4a8e2ea42c294e.tar.gz bcm5719-llvm-370cf00c9f685c70ed083b228f4a8e2ea42c294e.zip | |
Make sure we preserve alignment information after hoisting invariant load
In Polly, after hoisting loop invariant loads outside loop, the alignment
information for hoisted loads are missing, this patch restore them.
Contributed-by: Lawrence Hu <lawrence@codeaurora.org>
Differential Revision: http://reviews.llvm.org/D16160
llvm-svn: 258105
Diffstat (limited to 'polly/lib/CodeGen/IslNodeBuilder.cpp')
| -rw-r--r-- | polly/lib/CodeGen/IslNodeBuilder.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp index f75a304d07b..ee91a2cf5ae 100644 --- a/polly/lib/CodeGen/IslNodeBuilder.cpp +++ b/polly/lib/CodeGen/IslNodeBuilder.cpp @@ -893,15 +893,20 @@ bool IslNodeBuilder::materializeParameters(isl_set *Set, bool All) { } Value *IslNodeBuilder::preloadUnconditionally(isl_set *AccessRange, - isl_ast_build *Build, Type *Ty) { + isl_ast_build *Build, + Instruction *AccInst) { isl_pw_multi_aff *PWAccRel = isl_pw_multi_aff_from_set(AccessRange); PWAccRel = isl_pw_multi_aff_gist_params(PWAccRel, S.getContext()); isl_ast_expr *Access = isl_ast_build_access_from_pw_multi_aff(Build, PWAccRel); Value *PreloadVal = ExprBuilder.create(Access); + if (LoadInst *PreloadInst = dyn_cast<LoadInst>(PreloadVal)) + PreloadInst->setAlignment(dyn_cast<LoadInst>(AccInst)->getAlignment()); + // Correct the type as the SAI might have a different type than the user // expects, especially if the base pointer is a struct. + Type *Ty = AccInst->getType(); if (Ty == PreloadVal->getType()) return PreloadVal; @@ -916,6 +921,9 @@ Value *IslNodeBuilder::preloadUnconditionally(isl_set *AccessRange, Ptr = Builder.CreatePointerCast(Ptr, Ty->getPointerTo(), Ptr->getName() + ".cast"); PreloadVal = Builder.CreateLoad(Ptr, LInst->getName()); + if (LoadInst *PreloadInst = dyn_cast<LoadInst>(PreloadVal)) + PreloadInst->setAlignment(dyn_cast<LoadInst>(AccInst)->getAlignment()); + LInst->eraseFromParent(); return PreloadVal; } @@ -940,7 +948,7 @@ Value *IslNodeBuilder::preloadInvariantLoad(const MemoryAccess &MA, Value *PreloadVal = nullptr; if (AlwaysExecuted) { - PreloadVal = preloadUnconditionally(AccessRange, Build, AccInstTy); + PreloadVal = preloadUnconditionally(AccessRange, Build, AccInst); isl_ast_build_free(Build); isl_set_free(Domain); return PreloadVal; @@ -984,8 +992,7 @@ Value *IslNodeBuilder::preloadInvariantLoad(const MemoryAccess &MA, Builder.CreateBr(MergeBB); Builder.SetInsertPoint(ExecBB->getTerminator()); - Value *PreAccInst = preloadUnconditionally(AccessRange, Build, AccInstTy); - + Value *PreAccInst = preloadUnconditionally(AccessRange, Build, AccInst); Builder.SetInsertPoint(MergeBB->getTerminator()); auto *MergePHI = Builder.CreatePHI( AccInstTy, 2, "polly.preload." + AccInst->getName() + ".merge"); |

