Author: dpatel Date: Fri Aug 24 00:36:56 2007 New Revision: 41356 URL: http://llvm.org/viewvc/llvm-project?rev=41356&view=rev Log: Tightenup loop filter.
Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=41356&r1=41355&r2=41356&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Fri Aug 24 00:36:56 2007 @@ -272,7 +272,12 @@ if (!ExitingBlock) return; - + + // If exiting block is neither loop header nor loop latch then this loop is + // not suitable. + if (ExitingBlock != L->getHeader() && ExitingBlock != L->getLoopLatch()) + return; + // If exit block's terminator is conditional branch inst then we have found // exit condition. BranchInst *BR = dyn_cast<BranchInst>(ExitingBlock->getTerminator()); @@ -705,7 +710,22 @@ if (Succ0 == *PI) return false; - return true; + // Finally this split condition is safe only if merge point for + // split condition branch is loop latch. This check along with previous + // check, to ensure that exit condition is in either loop latch or header, + // filters all loops with non-empty loop body between merge point + // and exit condition. + DominanceFrontier::iterator Succ0DF = DF->find(Succ0); + assert (Succ0DF != DF->end() && "Unable to find Succ0 dominance frontier"); + if (Succ0DF->second.count(Latch)) + return true; + + DominanceFrontier::iterator Succ1DF = DF->find(Succ1); + assert (Succ1DF != DF->end() && "Unable to find Succ1 dominance frontier"); + if (Succ1DF->second.count(Latch)) + return true; + + return false; } /// splitLoop - Split current loop L in two loops using split information _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits