[llvm] r293293 - Fix BasicAA incorrect assumption on GEP

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 27 08:24:30 PST 2017


Has been approved for 4.0 in Phabricator by Hal (Code owner for AA).

Will cherry-pick.

— 
Mehdi


> On Jan 27, 2017, at 8:12 AM, Mehdi Amini via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: mehdi_amini
> Date: Fri Jan 27 10:12:22 2017
> New Revision: 293293
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=293293&view=rev
> Log:
> Fix BasicAA incorrect assumption on GEP
> 
> This is fixing pr31761: BasicAA is deducing NoAlias
> on the result of the GEP if the base pointer is itself NoAlias.
> 
> This is possible only if the NoAlias on the base pointer is
> deduced with a non-sized query: this should guarantee that
> the pointers are belonging to different memory allocation
> and that the GEP can't legally jump from one to another.
> 
> Differential Revision: https://reviews.llvm.org/D29216
> 
> Added:
>    llvm/trunk/test/Analysis/BasicAA/pr31761.ll
> Modified:
>    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> 
> Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=293293&r1=293292&r2=293293&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Fri Jan 27 10:12:22 2017
> @@ -1191,14 +1191,14 @@ AliasResult BasicAAResult::aliasGEP(cons
>       return MayAlias;
> 
>     AliasResult R = aliasCheck(UnderlyingV1, MemoryLocation::UnknownSize,
> -                               AAMDNodes(), V2, V2Size, V2AAInfo,
> -                               nullptr, UnderlyingV2);
> +                               AAMDNodes(), V2, MemoryLocation::UnknownSize,
> +                               V2AAInfo, nullptr, UnderlyingV2);
>     if (R != MustAlias)
>       // 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".
> +      // cannot alias per GEP semantics: "Any memory access must be done through
> +      // a pointer value associated with an address range of the memory access,
> +      // otherwise the behavior is undefined.".
>       return R;
> 
>     // If the max search depth is reached the result is undefined
> 
> Added: llvm/trunk/test/Analysis/BasicAA/pr31761.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/pr31761.ll?rev=293293&view=auto
> ==============================================================================
> --- llvm/trunk/test/Analysis/BasicAA/pr31761.ll (added)
> +++ llvm/trunk/test/Analysis/BasicAA/pr31761.ll Fri Jan 27 10:12:22 2017
> @@ -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
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list