[llvm] [Inline] Only consider provenance captures for scoped alias metadata (PR #138540)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon May 5 08:26:09 PDT 2025
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/138540
When determining whether an escape source may alias with a noalias argument, only take provenance captures into account. If only the address of the argument was captured, an access through the escape source is not legal.
>From 476e1a35059d5be256a78525d01519a9dc31ab15 Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Mon, 5 May 2025 17:10:51 +0200
Subject: [PATCH] [Inline] Only consider provenance captures for scoped alias
metadata
When determining whether an escape source may alias with a noalias
argument, only take provenance captures into account. If only the
address of the argument was captured, an access through the escape
source is not legal.
---
llvm/lib/Transforms/Utils/InlineFunction.cpp | 4 +++-
llvm/test/Transforms/Inline/noalias-escape-source.ll | 4 ++--
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp
index 7a91620af8272..8d9f8ff68ea10 100644
--- a/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -1313,7 +1313,9 @@ static void AddAliasScopeMetadata(CallBase &CB, ValueToValueMapTy &VMap,
// nocapture only guarantees that no copies outlive the function, not
// that the value cannot be locally captured.
if (!RequiresNoCaptureBefore ||
- !PointerMayBeCapturedBefore(A, /* ReturnCaptures */ false, I, &DT))
+ !capturesAnything(PointerMayBeCapturedBefore(
+ A, /*ReturnCaptures=*/false, I, &DT, /*IncludeI=*/false,
+ CaptureComponents::Provenance)))
NoAliases.push_back(NewScopes[A]);
}
diff --git a/llvm/test/Transforms/Inline/noalias-escape-source.ll b/llvm/test/Transforms/Inline/noalias-escape-source.ll
index 78b31da21a375..09835cb75b780 100644
--- a/llvm/test/Transforms/Inline/noalias-escape-source.ll
+++ b/llvm/test/Transforms/Inline/noalias-escape-source.ll
@@ -82,9 +82,9 @@ define void @test_addr_only_capture(ptr %p) {
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT: call void @llvm.experimental.noalias.scope.decl(metadata [[META6:![0-9]+]])
; CHECK-NEXT: call void @capture(ptr captures(address) [[P]])
-; CHECK-NEXT: [[P2_I:%.*]] = call ptr @get_ptr()
+; CHECK-NEXT: [[P2_I:%.*]] = call ptr @get_ptr(), !noalias [[META6]]
; CHECK-NEXT: [[V_I:%.*]] = load i32, ptr [[P]], align 4, !alias.scope [[META6]]
-; CHECK-NEXT: store i32 [[V_I]], ptr [[P2_I]], align 4
+; CHECK-NEXT: store i32 [[V_I]], ptr [[P2_I]], align 4, !noalias [[META6]]
; CHECK-NEXT: ret void
;
call void @callee_addr_only_capture(ptr %p)
More information about the llvm-commits
mailing list