diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 86f2d1589f4..c0cb13de73d 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -3006,63 +3006,42 @@ LSRInstance::CollectLoopInvariantFixupsAndFormulae() { /// CollectSubexprs - Split S into subexpressions which can be pulled out into /// separate registers. If C is non-null, multiply each subexpression by C. -static const SCEV *CollectSubexprs(const SCEV *S, const SCEVConstant *C, - SmallVectorImpl &Ops, - const Loop *L, - ScalarEvolution &SE, - unsigned Depth = 0) { - // Arbitrarily cap recursion to protect compile time. - if (Depth >= 3) - return S; - +static void CollectSubexprs(const SCEV *S, const SCEVConstant *C, + SmallVectorImpl &Ops, + const Loop *L, + ScalarEvolution &SE) { if (const SCEVAddExpr *Add = dyn_cast(S)) { // Break out add operands. for (SCEVAddExpr::op_iterator I = Add->op_begin(), E = Add->op_end(); - I != E; ++I) { - const SCEV *Remainder = CollectSubexprs(*I, C, Ops, L, SE, Depth+1); - if (Remainder) - Ops.push_back(C ? SE.getMulExpr(C, Remainder) : Remainder); - } - return NULL; + I != E; ++I) + CollectSubexprs(*I, C, Ops, L, SE); + return; } else if (const SCEVAddRecExpr *AR = dyn_cast(S)) { // Split a non-zero base out of an addrec. - if (AR->getStart()->isZero()) - return S; - - const SCEV *Remainder = CollectSubexprs(AR->getStart(), - C, Ops, L, SE, Depth+1); - // Split the non-zero AddRec unless it is part of a nested recurrence that - // does not pertain to this loop. - if (AR->getLoop() == L || !isa(Remainder)) { - if (Remainder) { - Ops.push_back(C ? SE.getMulExpr(C, Remainder) : Remainder); - Remainder = NULL; - } - } - if (Remainder != AR->getStart()) { - if (!Remainder) - Remainder = SE.getConstant(AR->getType(), 0); - return SE.getAddRecExpr(Remainder, - AR->getStepRecurrence(SE), - AR->getLoop(), - //FIXME: AR->getNoWrapFlags(SCEV::FlagNW) - SCEV::FlagAnyWrap); + if (!AR->getStart()->isZero()) { + CollectSubexprs(SE.getAddRecExpr(SE.getConstant(AR->getType(), 0), + AR->getStepRecurrence(SE), + AR->getLoop(), + //FIXME: AR->getNoWrapFlags(SCEV::FlagNW) + SCEV::FlagAnyWrap), + C, Ops, L, SE); + CollectSubexprs(AR->getStart(), C, Ops, L, SE); + return; } } else if (const SCEVMulExpr *Mul = dyn_cast(S)) { // Break (C * (a + b + c)) into C*a + C*b + C*c. - if (Mul->getNumOperands() != 2) - return S; - if (const SCEVConstant *Op0 = - dyn_cast(Mul->getOperand(0))) { - C = C ? cast(SE.getMulExpr(C, Op0)) : Op0; - const SCEV *Remainder = - CollectSubexprs(Mul->getOperand(1), C, Ops, L, SE, Depth+1); - if (Remainder) - Ops.push_back(SE.getMulExpr(C, Remainder)); - return NULL; - } + if (Mul->getNumOperands() == 2) + if (const SCEVConstant *Op0 = + dyn_cast(Mul->getOperand(0))) { + CollectSubexprs(Mul->getOperand(1), + C ? cast(SE.getMulExpr(C, Op0)) : Op0, + Ops, L, SE); + return; + } } - return S; + + // Otherwise use the value itself, optionally with a scale applied. + Ops.push_back(C ? SE.getMulExpr(C, S) : S); } /// GenerateReassociations - Split out subexpressions from adds and the bases of @@ -3077,9 +3056,7 @@ void LSRInstance::GenerateReassociations(LSRUse &LU, unsigned LUIdx, const SCEV *BaseReg = Base.BaseRegs[i]; SmallVector AddOps; - const SCEV *Remainder = CollectSubexprs(BaseReg, 0, AddOps, L, SE); - if (Remainder) - AddOps.push_back(Remainder); + CollectSubexprs(BaseReg, 0, AddOps, L, SE); if (AddOps.size() == 1) continue;