[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