Tightenup loop filter.
authorDevang Patel <dpatel@apple.com>
Fri, 24 Aug 2007 05:36:56 +0000 (05:36 +0000)
committerDevang Patel <dpatel@apple.com>
Fri, 24 Aug 2007 05:36:56 +0000 (05:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41356 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LoopIndexSplit.cpp

index 854b172422b810139072f2b1f36c33f9a2b3b189..6b69ecefef038f9564912e3ef27fbe0728a9187a 100644 (file)
@@ -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