Index: lib/Analysis/ScalarEvolution.cpp =================================================================== --- lib/Analysis/ScalarEvolution.cpp +++ lib/Analysis/ScalarEvolution.cpp @@ -4462,8 +4462,11 @@ if (const SCEVAddExpr *A = dyn_cast(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; } @@ -4472,33 +4475,45 @@ 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(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(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(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; }