[PATCH] Make ScalarEvolution less aggressive with respect to no-wrap flags.

Sanjoy Das sanjoy at playingwithpointers.com
Wed Jan 21 18:01:14 PST 2015


Hans,

The change has landed.

Thanks,
-- Sanjoy

On Wed, Jan 21, 2015 at 4:50 PM, Sanjoy Das
<sanjoy at playingwithpointers.com> wrote:
> REPOSITORY
>   rL LLVM
>
> http://reviews.llvm.org/D7081
>
> Files:
>   llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>   llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
>
> Index: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> ===================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> @@ -3154,8 +3154,9 @@
>    if (LHS == RHS)
>      return getConstant(LHS->getType(), 0);
>
> -  // X - Y --> X + -Y
> -  return getAddExpr(LHS, getNegativeSCEV(RHS), Flags);
> +  // X - Y --> X + -Y.
> +  // X -(nsw || nuw) Y --> X + -Y.
> +  return getAddExpr(LHS, getNegativeSCEV(RHS));
>  }
>
>  /// getTruncateOrZeroExtend - Return a SCEV corresponding to a conversion of the
> @@ -3461,12 +3462,10 @@
>                    if (isKnownPositive(getMinusSCEV(getSCEV(GEP), Ptr)))
>                      Flags = setFlags(Flags, SCEV::FlagNUW);
>                  }
> -              } else if (const SubOperator *OBO =
> -                           dyn_cast<SubOperator>(BEValueV)) {
> -                if (OBO->hasNoUnsignedWrap())
> -                  Flags = setFlags(Flags, SCEV::FlagNUW);
> -                if (OBO->hasNoSignedWrap())
> -                  Flags = setFlags(Flags, SCEV::FlagNSW);
> +
> +                // We cannot transfer nuw and nsw flags from subtraction
> +                // operations -- sub nuw X, Y is not the same as add nuw X, -Y
> +                // for instance.
>                }
>
>                const SCEV *StartVal = getSCEV(StartValueV);
> Index: llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
> ===================================================================
> --- llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
> +++ llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
> @@ -0,0 +1,41 @@
> +; RUN: opt -S -indvars < %s | FileCheck %s
> +
> +; Check that SCEV does not assume sub nuw X Y == add nuw X, -Y
> +define void @f(i32* %loc) {
> +; CHECK-LABEL: @f
> + entry:
> +  br label %loop
> +
> + loop:
> +  %idx = phi i32 [ 6, %entry ], [ %idx.dec, %loop ]
> +  store i32 %idx, i32* %loc
> +  %idx.dec = sub nuw i32 %idx, 1
> +  %cond = icmp uge i32 %idx.dec, 5
> +  br i1 %cond, label %loop, label %exit
> +; CHECK-NOT: br i1 true, label %loop, label %exit
> +
> + exit:
> +  ret void
> +}
> +
> +declare void @use_i1(i1)
> +
> +; Check that SCEV does not assume sub nsw X Y == add nsw X, -Y
> +define void @g(i32 %lim) {
> +; CHECK-LABEL: @g
> + entry:
> +  br label %loop
> +
> + loop:
> +  %idx = phi i32 [ -1, %entry ], [ %idx.dec, %loop ]
> +  %t = icmp sgt i32 %idx, 0
> +; CHECK-NOT:   call void @use_i1(i1 false)
> +; CHECK: call void @use_i1(i1 %t)
> +  call void @use_i1(i1 %t)
> +  %idx.dec = sub nsw i32 %idx, -2147483648
> +  %cond = icmp eq i32 %idx.dec, %lim
> +  br i1 %cond, label %loop, label %exit
> +
> + exit:
> +  ret void
> +}
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/



More information about the llvm-commits mailing list