[PATCH] D29946: [SCEV] Add early bail outs for the GetMinTrailingZeros

Igor Laevsky via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 14 08:37:46 PST 2017


igor-laevsky created this revision.
Herald added a subscriber: mzolotukhin.

There is no need to continue visiting expression once we have determined that there are no trailing zeros. Add early bailouts to account for this fact.


https://reviews.llvm.org/D29946

Files:
  lib/Analysis/ScalarEvolution.cpp


Index: lib/Analysis/ScalarEvolution.cpp
===================================================================
--- lib/Analysis/ScalarEvolution.cpp
+++ lib/Analysis/ScalarEvolution.cpp
@@ -4462,43 +4462,58 @@
   if (const SCEVAddExpr *A = dyn_cast<SCEVAddExpr>(S)) {
     // The result is the min of all operands results.
     uint32_t MinOpRes = GetMinTrailingZeros(A->getOperand(0));
-    for (unsigned i = 1, e = A->getNumOperands(); MinOpRes && i != e; ++i)
+    for (unsigned i = 1, e = A->getNumOperands(); MinOpRes && i != e; ++i) {
+      if (MinOpRes == 0)
+        break;
       MinOpRes = std::min(MinOpRes, GetMinTrailingZeros(A->getOperand(i)));
+    }
     return MinOpRes;
   }
 
   if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(S)) {
     // The result is the sum of all operands results.
     uint32_t SumOpRes = GetMinTrailingZeros(M->getOperand(0));
     uint32_t BitWidth = getTypeSizeInBits(M->getType());
     for (unsigned i = 1, e = M->getNumOperands();
-         SumOpRes != BitWidth && i != e; ++i)
+         SumOpRes != BitWidth && i != e; ++i) {
+      if (SumOpRes == 0)
+        break;
       SumOpRes =
           std::min(SumOpRes + GetMinTrailingZeros(M->getOperand(i)), BitWidth);
+    }
     return SumOpRes;
   }
 
   if (const SCEVAddRecExpr *A = dyn_cast<SCEVAddRecExpr>(S)) {
     // The result is the min of all operands results.
     uint32_t MinOpRes = GetMinTrailingZeros(A->getOperand(0));
-    for (unsigned i = 1, e = A->getNumOperands(); MinOpRes && i != e; ++i)
+    for (unsigned i = 1, e = A->getNumOperands(); MinOpRes && i != e; ++i) {
+      if (MinOpRes == 0)
+        break;
       MinOpRes = std::min(MinOpRes, GetMinTrailingZeros(A->getOperand(i)));
+    }
     return MinOpRes;
   }
 
   if (const SCEVSMaxExpr *M = dyn_cast<SCEVSMaxExpr>(S)) {
     // The result is the min of all operands results.
     uint32_t MinOpRes = GetMinTrailingZeros(M->getOperand(0));
-    for (unsigned i = 1, e = M->getNumOperands(); MinOpRes && i != e; ++i)
+    for (unsigned i = 1, e = M->getNumOperands(); MinOpRes && i != e; ++i) {
+      if (MinOpRes == 0)
+        break;
       MinOpRes = std::min(MinOpRes, GetMinTrailingZeros(M->getOperand(i)));
+    }
     return MinOpRes;
   }
 
   if (const SCEVUMaxExpr *M = dyn_cast<SCEVUMaxExpr>(S)) {
     // The result is the min of all operands results.
     uint32_t MinOpRes = GetMinTrailingZeros(M->getOperand(0));
-    for (unsigned i = 1, e = M->getNumOperands(); MinOpRes && i != e; ++i)
+    for (unsigned i = 1, e = M->getNumOperands(); MinOpRes && i != e; ++i) {
+      if (MinOpRes == 0)
+        break;
       MinOpRes = std::min(MinOpRes, GetMinTrailingZeros(M->getOperand(i)));
+    }
     return MinOpRes;
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29946.88379.patch
Type: text/x-patch
Size: 2719 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170214/ebe71844/attachment.bin>


More information about the llvm-commits mailing list