[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