[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