diff options
author | Jingu Kang <jingu.kang@arm.com> | 2021-09-02 15:47:24 +0100 |
---|---|---|
committer | Jingu Kang <jingu.kang@arm.com> | 2021-09-03 09:10:50 +0100 |
commit | 562521e2d15aff38587aef8c6ea1baf3ed87513c (patch) | |
tree | 2d1534045764d9a39a11ff65d8b012475d1e1465 /llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp | |
parent | 79d58b4d3017d159bf09a77398c9a116128de193 (diff) | |
download | llvm-562521e2d15aff38587aef8c6ea1baf3ed87513c.zip llvm-562521e2d15aff38587aef8c6ea1baf3ed87513c.tar.gz llvm-562521e2d15aff38587aef8c6ea1baf3ed87513c.tar.bz2 |
[LoopBoundSplit] Update phi node in exit block
It fixes https://bugs.llvm.org/show_bug.cgi?id=51700
Differential Revision:
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp b/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp index 993b154..a89f0aa 100644 --- a/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp +++ b/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Transforms/Scalar/LoopBoundSplit.h" +#include "llvm/ADT/Sequence.h" #include "llvm/Analysis/LoopAccessAnalysis.h" #include "llvm/Analysis/LoopAnalysisManager.h" #include "llvm/Analysis/LoopInfo.h" @@ -398,6 +399,20 @@ static bool splitLoopBound(Loop &L, DominatorTree &DT, LoopInfo &LI, else ExitingCond.BI->setSuccessor(1, PostLoopPreHeader); + // Update phi node in exit block of post-loop. + for (PHINode &PN : PostLoop->getExitBlock()->phis()) { + for (auto i : seq<int>(0, PN.getNumOperands())) { + // Check incoming block is pre-loop's exiting block. + if (PN.getIncomingBlock(i) == L.getExitingBlock()) { + // Replace pre-loop's exiting block by post-loop's preheader. + PN.setIncomingBlock(i, PostLoopPreHeader); + // Add a new incoming value with post-loop's exiting block. + PN.addIncoming(VMap[PN.getIncomingValue(i)], + PostLoop->getExitingBlock()); + } + } + } + // Update dominator tree. DT.changeImmediateDominator(PostLoopPreHeader, L.getExitingBlock()); DT.changeImmediateDominator(PostLoop->getExitBlock(), PostLoopPreHeader); |