[PATCH] D29216: Fix BasicAA incorrect assumption on GEP

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 27 00:23:45 PST 2017


The one thing i don't think we do right now, and i don't know how much it
it helps, it to use the pointer alignment to discount it being able to
alias certain variables/gep results.

Past that, doing better here pretty much devolves into SCEV math.

(or TBAA related metadata. The metadata about which fields are being
accessed where is really independent of strict aliasing, and is legal/not
legal independently of what type those fields are.  Strict aliasing just
layers on top of that to say that, additionally, the types of those fields
matter too)


On Fri, Jan 27, 2017 at 12:12 AM, Mehdi AMINI via Phabricator <
reviews at reviews.llvm.org> wrote:

> mehdi_amini created this revision.
>
> This is fixing pr31761: BasicAA was incorrectly assuming that
> it could deduce NoAlias on the result of the GEP if the base
> pointer is itself NoAlias.
>
> This is a quick fix, seems too conservative to me. I'd appreciate
> some guidance on how to solve it more cleanly!
>
>
> https://reviews.llvm.org/D29216
>
> Files:
>   llvm/lib/Analysis/BasicAliasAnalysis.cpp
>   llvm/test/Analysis/BasicAA/pr31761.ll
>   llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
>
>
> Index: llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
> ===================================================================
> --- llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
> +++ llvm/test/Transforms/SLPVectorizer/X86/tiny-tree.ll
> @@ -2,6 +2,8 @@
>  target triple = "x86_64-apple-macosx10.8.0"
>  ; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-apple-macosx10.8.0
> -mcpu=corei7 | FileCheck %s
>
> +; Sad sad sad alias analyais!
> +; XFAIL: *
>
>  ; CHECK: tiny_tree_fully_vectorizable
>  ; CHECK: load <2 x double>
> Index: llvm/test/Analysis/BasicAA/pr31761.ll
> ===================================================================
> --- /dev/null
> +++ llvm/test/Analysis/BasicAA/pr31761.ll
> @@ -0,0 +1,19 @@
> +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info
> -disable-output 2>&1 | FileCheck %s
> +
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.12.0"
> +
> +%struct.blam = type { i32, i32 }
> +
> +
> +; CHECK-DAG: MayAlias: i32* %tmp, i32* %tmp3
> +
> +define i1 @ham(%struct.blam* %arg)  {
> +  %isNull = icmp eq %struct.blam* %arg, null
> +  %tmp = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 0
> +  %tmp2 = getelementptr  %struct.blam, %struct.blam* %arg, i64 0, i32 1
> +  %select = select i1 %isNull, i32* null, i32* %tmp2
> +  %tmp3 = getelementptr  i32, i32* %select, i32 -1
> +  ret i1 true
> +}
> Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp
> ===================================================================
> --- llvm/lib/Analysis/BasicAliasAnalysis.cpp
> +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp
> @@ -1193,13 +1193,15 @@
>      AliasResult R = aliasCheck(UnderlyingV1, MemoryLocation::UnknownSize,
>                                 AAMDNodes(), V2, V2Size, V2AAInfo,
>                                 nullptr, UnderlyingV2);
> -    if (R != MustAlias)
> +    if (R != MustAlias) {
> +      if (GEP1BaseOffset != 0 && R == NoAlias)
> +        // If V2 is known not to alias GEP base pointer, then the two
> values
> +        // cannot alias only if the GEP is trivial. Otherwise
> conservatively
> +        // return MayAlias.
> +        return MayAlias;
>        // If V2 may alias GEP base pointer, conservatively returns
> MayAlias.
> -      // If V2 is known not to alias GEP base pointer, then the two values
> -      // cannot alias per GEP semantics: "A pointer value formed from a
> -      // getelementptr instruction is associated with the addresses
> associated
> -      // with the first operand of the getelementptr".
>        return R;
> +    }
>
>      // If the max search depth is reached the result is undefined
>      if (GEP1MaxLookupReached)
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170127/0bc475c7/attachment.html>


More information about the llvm-commits mailing list