[llvm] r201868 - fix a corner case in delinearization
Chandler Carruth
chandlerc at google.com
Fri Feb 21 16:32:40 PST 2014
No test case?
On Fri, Feb 21, 2014 at 10:15 AM, Sebastian Pop <spop at codeaurora.org> wrote:
> Author: spop
> Date: Fri Feb 21 12:15:15 2014
> New Revision: 201868
>
> URL: http://llvm.org/viewvc/llvm-project?rev=201868&view=rev
> Log:
> fix a corner case in delinearization
>
> handle special cases Step==1, Step==-1, GCD==1, and GCD==-1
>
> Modified:
> llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=201868&r1=201867&r2=201868&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Fri Feb 21 12:15:15 2014
> @@ -7255,46 +7255,37 @@ SCEVAddRecExpr::delinearize(ScalarEvolut
>
> DEBUG(dbgs() << "(delinearize: " << *this << "\n");
>
> - // Currently we fail to delinearize when the stride of this SCEV is 1.
> We
> - // could decide to not fail in this case: we could just return 1 for
> the size
> - // of the subscript, and this same SCEV for the access function.
> - if (Step == One) {
> - DEBUG(dbgs() << "failed to delinearize " << *this << "\n)\n");
> - return this;
> - }
> + // When the stride of this SCEV is 1, do not compute the GCD: the size
> of this
> + // subscript is 1, and this same SCEV for the access function.
> + const SCEV *Remainder = Zero;
> + const SCEV *GCD = One;
>
> // Find the GCD and Remainder of the Start and Step coefficients of
> this SCEV.
> - const SCEV *Remainder = NULL;
> - const SCEV *GCD = SCEVGCD::findGCD(SE, Start, Step, &Remainder);
> + if (Step != One && !Step->isAllOnesValue())
> + GCD = SCEVGCD::findGCD(SE, Start, Step, &Remainder);
>
> DEBUG(dbgs() << "GCD: " << *GCD << "\n");
> DEBUG(dbgs() << "Remainder: " << *Remainder << "\n");
>
> - // Same remark as above: we currently fail the delinearization,
> although we
> - // can very well handle this special case.
> - if (GCD == One) {
> - DEBUG(dbgs() << "failed to delinearize " << *this << "\n)\n");
> - return this;
> - }
> + const SCEV *Quotient = Start;
> + if (GCD != One && !GCD->isAllOnesValue())
> + // As findGCD computed Remainder, GCD divides "Start - Remainder." The
> + // Quotient is then this SCEV without Remainder, scaled down by the
> GCD. The
> + // Quotient is what will be used in the next subscript
> delinearization.
> + Quotient = SCEVDivision::divide(SE, SE.getMinusSCEV(Start,
> Remainder), GCD);
>
> - // As findGCD computed Remainder, GCD divides "Start - Remainder." The
> - // Quotient is then this SCEV without Remainder, scaled down by the
> GCD. The
> - // Quotient is what will be used in the next subscript delinearization.
> - const SCEV *Quotient =
> - SCEVDivision::divide(SE, SE.getMinusSCEV(Start, Remainder), GCD);
> DEBUG(dbgs() << "Quotient: " << *Quotient << "\n");
>
> - const SCEV *Rem;
> + const SCEV *Rem = Quotient;
> if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(Quotient))
> // Recursively call delinearize on the Quotient until there are no
> more
> // multiples that can be recognized.
> Rem = AR->delinearize(SE, Subscripts, Sizes);
> - else
> - Rem = Quotient;
>
> // Scale up the canonical induction variable IV by whatever remains
> from the
> // Step after division by the GCD: the GCD is the size of all the
> sub-array.
> - if (Step != GCD) {
> + if (Step != One && !Step->isAllOnesValue() && GCD != One &&
> + !GCD->isAllOnesValue() && Step != GCD) {
> Step = SCEVDivision::divide(SE, Step, GCD);
> IV = SE.getMulExpr(IV, Step);
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140221/0d84ae08/attachment.html>
More information about the llvm-commits
mailing list