[llvm] r218714 - [BasicAA] Make better use of zext and sign information

Lang Hames lhames at gmail.com
Thu Oct 2 18:44:36 PDT 2014


Hi Hal,

I've reverted this in 218944 to get the bots green again. I'm still working
on a reduced test case, but I expect to have something for you tomorrow.

Cheers,
Lang.


On Tue, Sep 30, 2014 at 3:43 PM, Hal Finkel <hfinkel at anl.gov> wrote:

> Author: hfinkel
> Date: Tue Sep 30 17:43:40 2014
> New Revision: 218714
>
> URL: http://llvm.org/viewvc/llvm-project?rev=218714&view=rev
> Log:
> [BasicAA] Make better use of zext and sign information
>
> Two related things:
>
>  1. Fixes a bug when calculating the offset in GetLinearExpression. The
> code
>     previously used zext to extend the offset, so negative offsets were
> converted
>     to large positive ones.
>
>  2. Enhance aliasGEP to deduce that, if the difference between two GEP
>     allocations is positive and all the variables that govern the offset
> are also
>     positive (i.e. the offset is strictly after the higher base pointer),
> then
>     locations that fit in the gap between the two base pointers are
> NoAlias.
>
> Patch by Nick White!
>
> Added:
>     llvm/trunk/test/Analysis/BasicAA/zext.ll
> Modified:
>     llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
>     llvm/trunk/test/Analysis/BasicAA/phi-aa.ll
>
> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=218714&r1=218713&r2=218714&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue Sep 30 17:43:40 2014
> @@ -254,7 +254,10 @@ static Value *GetLinearExpression(Value
>      Value *Result = GetLinearExpression(CastOp, Scale, Offset, Extension,
>                                          DL, Depth+1, AT, DT);
>      Scale = Scale.zext(OldWidth);
> -    Offset = Offset.zext(OldWidth);
> +
> +    // We have to sign-extend even if Extension == EK_ZeroExt as we can't
> +    // decompose a sign extension (i.e. zext(x - 1) != zext(x) -
> zext(-1)).
> +    Offset = Offset.sext(OldWidth);
>
>      return Result;
>    }
> @@ -1055,8 +1058,26 @@ BasicAliasAnalysis::aliasGEP(const GEPOp
>    // Grab the least significant bit set in any of the scales.
>    if (!GEP1VariableIndices.empty()) {
>      uint64_t Modulo = 0;
> -    for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i)
> +    bool AllPositive = true;
> +    for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i) {
> +      const Value *V = GEP1VariableIndices[i].V;
>        Modulo |= (uint64_t)GEP1VariableIndices[i].Scale;
> +
> +      // If the variable's been zero-extended or begins with a zero then
> +      //  we know it's positive. regardless of whether the value is signed
> +      // or unsigned.
> +      bool SignKnownZero, SignKnownOne;
> +      ComputeSignBit(
> +        const_cast<Value *>(V),
> +        SignKnownZero, SignKnownOne,
> +        DL, 0, AT, nullptr, DT);
> +      bool IsZExt = GEP1VariableIndices[i].Extension == EK_ZeroExt;
> +      AllPositive &= IsZExt || SignKnownZero;
> +
> +      // If the Value is currently positive but could change in a cycle,
> +      // then we can't guarantee it'll always br positive.
> +      AllPositive &= isValueEqualInPotentialCycles(V, V);
> +    }
>      Modulo = Modulo ^ (Modulo & (Modulo - 1));
>
>      // We can compute the difference between the two addresses
> @@ -1066,6 +1087,12 @@ BasicAliasAnalysis::aliasGEP(const GEPOp
>      if (V1Size != UnknownSize && V2Size != UnknownSize &&
>          ModOffset >= V2Size && V1Size <= Modulo - ModOffset)
>        return NoAlias;
> +
> +    // If we know all the variables are positive, then GEP1 >=
> GEP1BasePtr.
> +    // If GEP1BasePtr > V2 (GEP1BaseOffset > 0) then we know the pointers
> +    // don't alias if V2Size can fit in the gap between V2 and
> GEP1BasePtr.
> +    if (AllPositive && GEP1BaseOffset > 0 && V2Size <= (uint64_t)
> GEP1BaseOffset)
> +      return NoAlias;
>    }
>
>    // Statically, we can see that the base objects are the same, but the
>
> Modified: llvm/trunk/test/Analysis/BasicAA/phi-aa.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/phi-aa.ll?rev=218714&r1=218713&r2=218714&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Analysis/BasicAA/phi-aa.ll (original)
> +++ llvm/trunk/test/Analysis/BasicAA/phi-aa.ll Tue Sep 30 17:43:40 2014
> @@ -39,6 +39,7 @@ return:
>
>  ; CHECK-LABEL: pr18068
>  ; CHECK: MayAlias: i32* %0, i32* %arrayidx5
> +; CHECK: NoAlias: i32* %arrayidx13, i32* %arrayidx5
>
>  define i32 @pr18068(i32* %jj7, i32* %j) {
>  entry:
>
> Added: llvm/trunk/test/Analysis/BasicAA/zext.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/zext.ll?rev=218714&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Analysis/BasicAA/zext.ll (added)
> +++ llvm/trunk/test/Analysis/BasicAA/zext.ll Tue Sep 30 17:43:40 2014
> @@ -0,0 +1,65 @@
> +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info
> -disable-output 2>&1 | FileCheck %s
> +target datalayout =
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +; CHECK-LABEL: test_with_zext
> +; CHECK:  NoAlias: i8* %a, i8* %b
> +
> +define void @test_with_zext() {
> +  %1 = tail call i8* @malloc(i64 120)
> +  %a = getelementptr inbounds i8* %1, i64 8
> +  %2 = getelementptr inbounds i8* %1, i64 16
> +  %3 = zext i32 3 to i64
> +  %b = getelementptr inbounds i8* %2, i64 %3
> +  ret void
> +}
> +
> +; CHECK-LABEL: test_with_lshr
> +; CHECK:  NoAlias: i8* %a, i8* %b
> +
> +define void @test_with_lshr(i64 %i) {
> +  %1 = tail call i8* @malloc(i64 120)
> +  %a = getelementptr inbounds i8* %1, i64 8
> +  %2 = getelementptr inbounds i8* %1, i64 16
> +  %3 = lshr i64 %i, 2
> +  %b = getelementptr inbounds i8* %2, i64 %3
> +  ret void
> +}
> +
> +; CHECK-LABEL: test_with_a_loop
> +; CHECK:  NoAlias: i8* %a, i8* %b
> +
> +define void @test_with_a_loop() {
> +  %1 = tail call i8* @malloc(i64 120)
> +  %a = getelementptr inbounds i8* %1, i64 8
> +  %2 = getelementptr inbounds i8* %1, i64 16
> +  br label %for.loop
> +
> +for.loop:
> +  %i = phi i32 [ 0, %0 ], [ %i.next, %for.loop ]
> +  %3 = zext i32 %i to i64
> +  %b = getelementptr inbounds i8* %2, i64 %3
> +  %i.next = add nuw nsw i32 %i, 1
> +  %4 = icmp eq i32 %i.next, 10
> +  br i1 %4, label %for.loop.exit, label %for.loop
> +
> +for.loop.exit:
> +  ret void
> +}
> +
> +; CHECK-LABEL: test_sign_extension
> +; CHECK:  PartialAlias: i64* %b.i64, i8* %a
> +
> +define void @test_sign_extension(i32 %p) {
> +  %1 = tail call i8* @malloc(i64 120)
> +  %p.64 = zext i32 %p to i64
> +  %a = getelementptr inbounds i8* %1, i64 %p.64
> +  %p.minus1 = add i32 %p, -1
> +  %p.minus1.64 = zext i32 %p.minus1 to i64
> +  %b.i8 = getelementptr inbounds i8* %1, i64 %p.minus1.64
> +  %b.i64 = bitcast i8* %b.i8 to i64*
> +  ret void
> +}
> +
> +; Function Attrs: nounwind
> +declare noalias i8* @malloc(i64)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141002/9f04a91c/attachment.html>


More information about the llvm-commits mailing list