Tightenup loop filter.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41356 91177308-0d34-0410-b5e6-96231b3b80d8
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 @@
 
   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