diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -106,8 +106,9 @@ /// Returns true if the pointer is one which would have been considered an /// escape by isNonEscapingLocalObject. static bool isEscapeSource(const Value *V) { - if (isa(V)) - return true; + if (auto *CB = dyn_cast(V)) + return !isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(CB, + true); // The load case works because isNonEscapingLocalObject considers all // stores to be escapes (it passes true for the StoreCaptures argument diff --git a/llvm/test/Analysis/BasicAA/call-escape-source.ll b/llvm/test/Analysis/BasicAA/call-escape-source.ll --- a/llvm/test/Analysis/BasicAA/call-escape-source.ll +++ b/llvm/test/Analysis/BasicAA/call-escape-source.ll @@ -1,11 +1,11 @@ ; RUN: opt -aa-eval -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s -; FIXME: A call return value is not always an escape source, because +; A call return value is not always an escape source, because ; CaptureTracking can look through some calls. The test is constructed to ; hit the getUnderlyingObject() recursion limit. define i32 @test() { ; CHECK-LABEL: Function: test -; CHECK-NEXT: NoAlias: i32* %a, i32* %p7 +; CHECK-NEXT: MustAlias: i32* %a, i32* %p7 %a = alloca i32 %p1 = call ptr @llvm.strip.invariant.group.p0(ptr %a) %p2 = getelementptr i8, ptr %p1, i64 1