aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
diff options
context:
space:
mode:
authorJingu Kang <jingu.kang@arm.com>2021-09-02 15:47:24 +0100
committerJingu Kang <jingu.kang@arm.com>2021-09-03 09:10:50 +0100
commit562521e2d15aff38587aef8c6ea1baf3ed87513c (patch)
tree2d1534045764d9a39a11ff65d8b012475d1e1465 /llvm/lib/Transforms/Scalar/LoopBoundSplit.cpp
parent79d58b4d3017d159bf09a77398c9a116128de193 (diff)
downloadllvm-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.cpp15
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);