[llvm] bcadfc2 - [BasicAA] Handle passthru calls in isEscapeSource()

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 24 02:01:04 PDT 2022


Author: Nikita Popov
Date: 2022-06-24T11:00:57+02:00
New Revision: bcadfc2595ba25e77145fc8d9f57981ac52b9348

URL: https://github.com/llvm/llvm-project/commit/bcadfc2595ba25e77145fc8d9f57981ac52b9348
DIFF: https://github.com/llvm/llvm-project/commit/bcadfc2595ba25e77145fc8d9f57981ac52b9348.diff

LOG: [BasicAA] Handle passthru calls in isEscapeSource()

isEscapeSource() currently considers all call return values as
escape sources. However, CaptureTracking can look through certain
calls, so we shouldn't consider these as escape sources either.

The corresponding CaptureTracking code is:
https://github.com/llvm/llvm-project/blob/7c9a3825b8420f5d37c5bb8919a9e46684a87089/llvm/lib/Analysis/CaptureTracking.cpp#L332-L333

Differential Revision: https://reviews.llvm.org/D128444

Added: 
    

Modified: 
    llvm/lib/Analysis/BasicAliasAnalysis.cpp
    llvm/test/Analysis/BasicAA/call-escape-source.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 11b71fe1e32c9..5356d629ea382 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -106,8 +106,9 @@ bool BasicAAResult::invalidate(Function &Fn, const PreservedAnalyses &PA,
 /// Returns true if the pointer is one which would have been considered an
 /// escape by isNonEscapingLocalObject.
 static bool isEscapeSource(const Value *V) {
-  if (isa<CallBase>(V))
-    return true;
+  if (auto *CB = dyn_cast<CallBase>(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
index f2068e4d6a349..b5c2be0409a15 100644
--- 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


        


More information about the llvm-commits mailing list