Index: lib/Transforms/Scalar/LoopStrengthReduce.cpp =================================================================== --- lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1759,6 +1759,8 @@ DenseSet &VisitedRegs) const; void Solve(SmallVectorImpl &Solution) const; + bool IsNothingCheaperThanBestSolution(Cost BestCost) const; + BasicBlock::iterator HoistInsertPosition(BasicBlock::iterator IP, const SmallVectorImpl &Inputs) const; @@ -4211,6 +4213,25 @@ NarrowSearchSpaceByPickingWinnerRegs(); } +bool LSRInstance::IsNothingCheaperThanBestSolution(Cost BestCost) const { + DenseSet VisitedRegs; + SmallPtrSet Regs; + Cost BaseCost; + + for (const LSRFixup &LF : Fixups) { + const SCEV *S = SE.getSCEV(LF.OperandValToReplace); + Formula F; + F.initialMatch(S, L, SE); + + const LSRUse &LU = Uses[LF.LUIdx]; + BaseCost.RateFormula(TTI, F, Regs, VisitedRegs, L, LU.Offsets, SE, DT, LU); + if (BestCost < BaseCost) + return false; + } + return (BaseCost < BestCost); +} + + /// This is the recursive solver. void LSRInstance::SolveRecurse(SmallVectorImpl &Solution, Cost &SolutionCost, @@ -4306,6 +4327,10 @@ if (Solution.empty()) { DEBUG(dbgs() << "\nNo Satisfactory Solution\n"); return; + } else if (IsNothingCheaperThanBestSolution(SolutionCost)) { + DEBUG(dbgs() << "\nThe best solution is not cheaper than no LSR\n"); + Solution.clear(); + return; } // Ok, we've now made all our decisions.