summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/LoopSimplify.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-18 22:27:10 +0000
committerChris Lattner <sabre@nondot.org>2004-04-18 22:27:10 +0000
commit827826320d204115d6a52ac7489e911ef7fab577 (patch)
tree882b88a55912d3e97651d5a71f507d24f5c787eb /llvm/lib/Transforms/Scalar/LoopSimplify.cpp
parentd6ce359d3b9d40495d72c3d10ee3f6372c774a26 (diff)
downloadbcm5719-llvm-827826320d204115d6a52ac7489e911ef7fab577.tar.gz
bcm5719-llvm-827826320d204115d6a52ac7489e911ef7fab577.zip
Correct rewriting of exit blocks after my last patch
llvm-svn: 13048
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopSimplify.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopSimplify.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp
index 167075f3be3..b2752089d44 100644
--- a/llvm/lib/Transforms/Scalar/LoopSimplify.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopSimplify.cpp
@@ -73,7 +73,7 @@ namespace {
bool ProcessLoop(Loop *L);
BasicBlock *SplitBlockPredecessors(BasicBlock *BB, const char *Suffix,
const std::vector<BasicBlock*> &Preds);
- void RewriteLoopExitBlock(Loop *L, BasicBlock *Exit);
+ BasicBlock *RewriteLoopExitBlock(Loop *L, BasicBlock *Exit);
void InsertPreheaderForLoop(Loop *L);
Loop *SeparateNestedLoop(Loop *L);
void InsertUniqueBackedgeBlock(Loop *L);
@@ -158,7 +158,11 @@ bool LoopSimplify::ProcessLoop(Loop *L) {
for (pred_iterator PI = pred_begin(ExitBlock), PE = pred_end(ExitBlock);
PI != PE; ++PI)
if (!L->contains(*PI)) {
- RewriteLoopExitBlock(L, ExitBlock);
+ BasicBlock *NewBB = RewriteLoopExitBlock(L, ExitBlock);
+ for (unsigned j = i; j != ExitBlocks.size(); ++j)
+ if (ExitBlocks[j] == ExitBlock)
+ ExitBlocks[j] = NewBB;
+
NumInserted++;
Changed = true;
break;
@@ -387,7 +391,7 @@ void LoopSimplify::InsertPreheaderForLoop(Loop *L) {
/// RewriteLoopExitBlock - Ensure that the loop preheader dominates all exit
/// blocks. This method is used to split exit blocks that have predecessors
/// outside of the loop.
-void LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) {
+BasicBlock *LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) {
DominatorSet &DS = getAnalysis<DominatorSet>();
std::vector<BasicBlock*> LoopBlocks;
@@ -405,6 +409,7 @@ void LoopSimplify::RewriteLoopExitBlock(Loop *L, BasicBlock *Exit) {
// Update dominator information (set, immdom, domtree, and domfrontier)
UpdateDomInfoForRevectoredPreds(NewBB, LoopBlocks);
+ return NewBB;
}
/// AddBlockAndPredsToSet - Add the specified block, and all of its
OpenPOWER on IntegriCloud