[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