[llvm-commits] [llvm] r154262 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/nsw-offset.ll test/Analysis/ScalarEvolution/nsw.ll

Andrew Trick atrick at apple.com
Mon Apr 16 21:13:51 PDT 2012


On Apr 7, 2012, at 10:19 AM, Benjamin Kramer <benny.kra at googlemail.com> wrote:

> Author: d0k
> Date: Sat Apr  7 12:19:26 2012
> New Revision: 154262
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=154262&view=rev
> Log:
> SCEV: When expanding a GEP the final addition to the base pointer has NUW but not NSW.

It does?

Inbounds geps can compute negative offsets relative to each other.
%p1 = gep inbounds i8* %base, %n
%p2 = gep inbounds i8* %p, -1
load i8* %p2

I agree the NSW flag is system dependent. I think we'd like to assume that objects don't cross the 4G boundary. I won't argue for or against it. I was preserving an optimization someone else added ;)

-Andy

> 
> Found by inspection.
> 
> Modified:
>    llvm/trunk/lib/Analysis/ScalarEvolution.cpp
>    llvm/trunk/test/Analysis/ScalarEvolution/nsw-offset.ll
>    llvm/trunk/test/Analysis/ScalarEvolution/nsw.ll
> 
> Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=154262&r1=154261&r2=154262&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
> +++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sat Apr  7 12:19:26 2012
> @@ -3187,7 +3187,7 @@
> 
>   // Add the total offset from all the GEP indices to the base.
>   return getAddExpr(BaseS, TotalOffset,
> -                    isInBounds ? SCEV::FlagNSW : SCEV::FlagAnyWrap);
> +                    isInBounds ? SCEV::FlagNUW : SCEV::FlagAnyWrap);
> }
> 
> /// GetMinTrailingZeros - Determine the minimum number of zero bits that S is
> 
> Modified: llvm/trunk/test/Analysis/ScalarEvolution/nsw-offset.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/nsw-offset.ll?rev=154262&r1=154261&r2=154262&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/ScalarEvolution/nsw-offset.ll (original)
> +++ llvm/trunk/test/Analysis/ScalarEvolution/nsw-offset.ll Sat Apr  7 12:19:26 2012
> @@ -23,7 +23,7 @@
>   %1 = sext i32 %i.01 to i64                      ; <i64> [#uses=1]
> 
> ; CHECK: %2 = getelementptr inbounds double* %d, i64 %1
> -; CHECK: -->  {%d,+,16}<nsw><%bb>
> +; CHECK: -->  {%d,+,16}<nuw><%bb>
>   %2 = getelementptr inbounds double* %d, i64 %1  ; <double*> [#uses=1]
> 
>   %3 = load double* %2, align 8                   ; <double> [#uses=1]
> @@ -37,7 +37,7 @@
>   %8 = sext i32 %7 to i64                         ; <i64> [#uses=1]
> 
> ; CHECK: %9 = getelementptr inbounds double* %q, i64 %8
> -; CHECK: {(8 + %q),+,16}<nsw><%bb>
> +; CHECK: {(8 + %q),+,16}<nuw><%bb>
>   %9 = getelementptr inbounds double* %q, i64 %8  ; <double*> [#uses=1]
> 
> ; Artificially repeat the above three instructions, this time using
> @@ -49,7 +49,7 @@
>   %t8 = sext i32 %t7 to i64                         ; <i64> [#uses=1]
> 
> ; CHECK: %t9 = getelementptr inbounds double* %q, i64 %t8
> -; CHECK: {(8 + %q),+,16}<nsw><%bb>
> +; CHECK: {(8 + %q),+,16}<nuw><%bb>
>   %t9 = getelementptr inbounds double* %q, i64 %t8  ; <double*> [#uses=1]
> 
>   %10 = load double* %9, align 8                  ; <double> [#uses=1]
> 
> Modified: llvm/trunk/test/Analysis/ScalarEvolution/nsw.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/nsw.ll?rev=154262&r1=154261&r2=154262&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/ScalarEvolution/nsw.ll (original)
> +++ llvm/trunk/test/Analysis/ScalarEvolution/nsw.ll Sat Apr  7 12:19:26 2012
> @@ -92,10 +92,10 @@
> ; CHECK: {1,+,1}<nuw><nsw><%for.body.i.i>
>   %ptrincdec.i.i = getelementptr inbounds i32* %begin, i64 %tmp
> ; CHECK: %ptrincdec.i.i =
> -; CHECK: {(4 + %begin),+,4}<nsw><%for.body.i.i>
> +; CHECK: {(4 + %begin),+,4}<nuw><%for.body.i.i>
>   %__first.addr.08.i.i = getelementptr inbounds i32* %begin, i64 %indvar.i.i
> ; CHECK: %__first.addr.08.i.i
> -; CHECK: {%begin,+,4}<nsw><%for.body.i.i>
> +; CHECK: {%begin,+,4}<nuw><%for.body.i.i>
>   store i32 0, i32* %__first.addr.08.i.i, align 4
>   %cmp.i.i = icmp eq i32* %ptrincdec.i.i, %end
>   br i1 %cmp.i.i, label %_ZSt4fillIPiiEvT_S1_RKT0_.exit, label %for.body.i.i
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list