[UnJ] Create a hasInvariantIterationCount function. NFC

Pulled out a separate function for some code that calculates
if an inner loop iteration count is invariant to it's outer
loop.

Differential Revision: https://reviews.llvm.org/D50063

llvm-svn: 339500
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp b/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp
index 07b5f20..cc80e11 100644
--- a/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp
@@ -754,20 +754,7 @@
 
   // Check inner loop backedge count is consistent on all iterations of the
   // outer loop
-  auto CheckInnerLoopIterationCountInvariant = [](Loop *SubLoop, Loop *OuterL,
-                                                  ScalarEvolution &SE) {
-    BasicBlock *SubLoopLatch = SubLoop->getLoopLatch();
-    const SCEV *SubLoopBECountSC = SE.getExitCount(SubLoop, SubLoopLatch);
-    if (isa<SCEVCouldNotCompute>(SubLoopBECountSC) ||
-        !SubLoopBECountSC->getType()->isIntegerTy())
-      return false;
-    ScalarEvolution::LoopDisposition LD =
-        SE.getLoopDisposition(SubLoopBECountSC, OuterL);
-    if (LD != ScalarEvolution::LoopInvariant)
-      return false;
-    return true;
-  };
-  if (!CheckInnerLoopIterationCountInvariant(SubLoop, L, SE)) {
+  if (!hasInvariantIterationCount(SubLoop, SE)) {
     LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; Inner loop iteration count is "
                          "not consistent on each iteration\n");
     return false;
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp
index 8e9235b..e9db472 100644
--- a/llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp
@@ -1521,6 +1521,28 @@
     return (FalseVal + (TrueVal / 2)) / TrueVal;
 }
 
+bool llvm::hasInvariantIterationCount(Loop *InnerLoop,
+                                      ScalarEvolution &SE) {
+  Loop *OuterL = InnerLoop->getParentLoop();
+  if (!OuterL)
+    return true;
+
+  // Get the backedge taken count for the inner loop
+  BasicBlock *InnerLoopLatch = InnerLoop->getLoopLatch();
+  const SCEV *InnerLoopBECountSC = SE.getExitCount(InnerLoop, InnerLoopLatch);
+  if (isa<SCEVCouldNotCompute>(InnerLoopBECountSC) ||
+      !InnerLoopBECountSC->getType()->isIntegerTy())
+    return false;
+
+  // Get whether count is invariant to the outer loop
+  ScalarEvolution::LoopDisposition LD =
+      SE.getLoopDisposition(InnerLoopBECountSC, OuterL);
+  if (LD != ScalarEvolution::LoopInvariant)
+    return false;
+
+  return true;
+}
+
 /// Adds a 'fast' flag to floating point operations.
 static Value *addFastMathFlag(Value *V) {
   if (isa<FPMathOperator>(V)) {