[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