aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-08-24 05:36:56 +0000
committerDevang Patel <dpatel@apple.com>2007-08-24 05:36:56 +0000
commitb88e4200cfc3cfd06320efd9400405e98dd4c5f4 (patch)
treef16b8c26abf7d84d4b0862dd03e014dd68a974bf /lib
parent7237d1167a0d79a9eb1662706db42f3af996f841 (diff)
downloadexternal_llvm-b88e4200cfc3cfd06320efd9400405e98dd4c5f4.zip
external_llvm-b88e4200cfc3cfd06320efd9400405e98dd4c5f4.tar.gz
external_llvm-b88e4200cfc3cfd06320efd9400405e98dd4c5f4.tar.bz2
Tightenup loop filter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41356 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Scalar/LoopIndexSplit.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/LoopIndexSplit.cpp b/lib/Transforms/Scalar/LoopIndexSplit.cpp
index 854b172..6b69ece 100644
--- a/lib/Transforms/Scalar/LoopIndexSplit.cpp
+++ b/lib/Transforms/Scalar/LoopIndexSplit.cpp
@@ -272,7 +272,12 @@ void LoopIndexSplit::findLoopConditionals() {
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 @@ bool LoopIndexSplit::safeSplitCondition(SplitInfo &SD) {
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