[llvm-commits] [llvm] r157701 - in /llvm/trunk: include/llvm/Analysis/ScalarEvolution.h lib/Analysis/ScalarEvolution.cpp test/Transforms/IndVarSimplify/ult-sub-to-eq.ll

Eli Friedman eli.friedman at gmail.com
Wed May 30 11:39:04 PDT 2012


On Wed, May 30, 2012 at 11:32 AM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Wed May 30 13:32:23 2012
> New Revision: 157701
>
> URL: http://llvm.org/viewvc/llvm-project?rev=157701&view=rev
> Log:
> Teach SCEV's icmp simplification logic that a-b == 0 is equivalent to a == b.
>
> This also required making recursive simplifications until
> nothing changes or a hard limit (currently 3) is hit.
>
> With the simplification in place indvars can canonicalize
> loops of the form
> for (unsigned i = 0; i < a-b; ++i)
> into
> for (unsigned i = 0; i != a-b; ++i)
> which used to fail because SCEV created a weird umax expr
> for the backedge taken count.
>
> Added:
>    llvm/trunk/test/Transforms/IndVarSimplify/ult-sub-to-eq.ll
> Modified:
>    llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
>    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/ScalarEvolution.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/ScalarEvolution.h?rev=157701&r1=157700&r2=157701&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/ScalarEvolution.h (original)
> +++ llvm/trunk/include/llvm/Analysis/ScalarEvolution.h Wed May 30 13:32:23 2012
> @@ -837,7 +837,8 @@
>     ///
>     bool SimplifyICmpOperands(ICmpInst::Predicate &Pred,
>                               const SCEV *&LHS,
> -                              const SCEV *&RHS);
> +                              const SCEV *&RHS,
> +                              unsigned Depth = 0);
>
>     /// getLoopDisposition - Return the "disposition" of the given SCEV with
>     /// respect to the given loop.
>
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=157701&r1=157700&r2=157701&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Wed May 30 13:32:23 2012
> @@ -5605,9 +5605,14 @@
>  /// predicate Pred. Return true iff any changes were made.
>  ///
>  bool ScalarEvolution::SimplifyICmpOperands(ICmpInst::Predicate &Pred,
> -                                           const SCEV *&LHS, const SCEV *&RHS) {
> +                                           const SCEV *&LHS, const SCEV *&RHS,
> +                                           unsigned Depth) {
>   bool Changed = false;
>
> +  // If we hit the max recursion limit bail out.
> +  if (Depth >= 3)
> +    return false;
> +
>   // Canonicalize a constant to the right side.
>   if (const SCEVConstant *LHSC = dyn_cast<SCEVConstant>(LHS)) {
>     // Check for both operands constant.
> @@ -5645,6 +5650,15 @@
>     default: llvm_unreachable("Unexpected ICmpInst::Predicate value!");
>     case ICmpInst::ICMP_EQ:
>     case ICmpInst::ICMP_NE:
> +      // Fold ((-1) * %a) + %b == 0 (equivalent to %b-%a == 0) into %a == %b.
> +      if (!RA)
> +        if (const SCEVAddExpr *AE = dyn_cast<SCEVAddExpr>(LHS))
> +          if (const SCEVMulExpr *ME = dyn_cast<SCEVMulExpr>(AE->getOperand(0)))
> +            if (ME->getOperand(0)->isAllOnesValue()) {
> +              RHS = AE->getOperand(1);
> +              LHS = ME->getOperand(1);
> +              Changed = true;

Err, SCEVAddExpr can have more than 2 operands...

-Eli




More information about the llvm-commits mailing list