diff options
author | Serguei Katkov <serguei.katkov@azul.com> | 2017-07-19 04:49:17 +0000 |
---|---|---|
committer | Serguei Katkov <serguei.katkov@azul.com> | 2017-07-19 04:49:17 +0000 |
commit | 4ea855ebe5f760fa086f39e6d6ee023690526af4 (patch) | |
tree | b67c3c5234438d254abaf0cab46d9ebc52c8ed79 /llvm/lib/CodeGen | |
parent | bb83558f00d874250cab0f16f5d80c1bf45a1220 (diff) | |
download | bcm5719-llvm-4ea855ebe5f760fa086f39e6d6ee023690526af4.tar.gz bcm5719-llvm-4ea855ebe5f760fa086f39e6d6ee023690526af4.zip |
[CGP] Allow cycles during Phi traversal in OptimizaMemoryInst
Allowing cycles in Phi traversal increases the scope of optimize memory instruction
in case we are in loop.
The added test shows an example of enabling optimization inside a loop.
Reviewers: loladiro, spatel, efriedma
Reviewed By: efriedma
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D35294
llvm-svn: 308419
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/CodeGenPrepare.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 3080757487e..45dc13d58de 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -4278,11 +4278,17 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, Value *V = worklist.back(); worklist.pop_back(); - // Break use-def graph loops. - if (!Visited.insert(V).second) { - AddrModeFound = false; - break; - } + // We allow traversing cyclic Phi nodes. + // In case of success after this loop we ensure that traversing through + // Phi nodes ends up with all cases to compute address of the form + // BaseGV + Base + Scale * Index + Offset + // where Scale and Offset are constans and BaseGV, Base and Index + // are exactly the same Values in all cases. + // It means that BaseGV, Scale and Offset dominate our memory instruction + // and have the same value as they had in address computation represented + // as Phi. So we can safely sink address computation to memory instruction. + if (!Visited.insert(V).second) + continue; // For a PHI node, push all of its incoming values. if (PHINode *P = dyn_cast<PHINode>(V)) { |