From 3fe4f2135a951477b9e2a32401bfea09beed3d71 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 15 Aug 2007 02:14:55 +0000 Subject: [PATCH] Avoid triangle loops. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41093 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopIndexSplit.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp index dfe33ffe16c..6e04e9f4809 100644 --- a/lib/Transforms/Scalar/LoopIndexSplit.cpp +++ b/lib/Transforms/Scalar/LoopIndexSplit.cpp @@ -154,7 +154,7 @@ bool LoopIndexSplit::runOnLoop(Loop *IncomingLoop, LPPassManager &LPM_Ref) { L = IncomingLoop; LPM = &LPM_Ref; - // FIXME - Nested loops makes dominator info updates tricky. + // FIXME - Nested loops make dominator info updates tricky. if (!L->getSubLoops().empty()) return false; @@ -605,7 +605,7 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP, WorkList.push_back(std::make_pair(DeadBB, succ_begin(DeadBB))); while (!WorkList.empty()) { BasicBlock *BB = WorkList.back(). first; - succ_iterator SIter =WorkList.back().second; + succ_iterator SIter = WorkList.back().second; // If all successor's are processed then remove this block. if (SIter == succ_end(BB)) { @@ -659,8 +659,8 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP, if (!DT->dominates(LiveBB, DFMember)) LiveDF->second.insert(DFMember); } - DF->removeFromFrontier(LiveDF, SuccBB); + DF->removeFromFrontier(LiveDF, SuccBB); } } } @@ -669,6 +669,19 @@ void LoopIndexSplit::removeBlocks(BasicBlock *DeadBB, Loop *LP, bool LoopIndexSplit::splitLoop(SplitInfo &SD) { BasicBlock *Preheader = L->getLoopPreheader(); + BasicBlock *SplitBlock = SD.SplitCondition->getParent(); + BasicBlock *Latch = L->getLoopLatch(); + BasicBlock *Header = L->getHeader(); + BranchInst *SplitTerminator = cast(SplitBlock->getTerminator()); + + // FIXME - Unable to handle triange loops at the moment. + // In triangle loop, split condition is in header and one of the + // the split destination is loop latch. If split condition is EQ + // then such loops are already handle in processOneIterationLoop(). + if (Header == SplitBlock + && (Latch == SplitTerminator->getSuccessor(0) + || Latch == SplitTerminator->getSuccessor(1))) + return false; // True loop is original loop. False loop is cloned loop. @@ -770,7 +783,6 @@ bool LoopIndexSplit::splitLoop(SplitInfo &SD) { SplitEdge(ExitBlock, FalseHeader, this); //[*] Eliminate split condition's false branch from True loop. - BasicBlock *SplitBlock = SD.SplitCondition->getParent(); BranchInst *BR = cast(SplitBlock->getTerminator()); BasicBlock *FBB = BR->getSuccessor(1); BR->setUnconditionalDest(BR->getSuccessor(0)); -- 2.34.1