[llvm] [BasicAA] Treat ExtractValue(Argument) similar to Argument in relation to function-local objects. (PR #134716)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 7 12:51:11 PDT 2025
https://github.com/davemgreen created https://github.com/llvm/llvm-project/pull/134716
This is a much smaller, technically orthogonal patch similar to #134505. It
states that a extractvalue(Argument) can be treated like an Argument for alias
analysis, where the extractelement acts like a phi / copy. No inttotr here. I'm
hoping for this operations this is perfectly sensible, but it is quite a
complex area.
>From 5bf7305513660148c6bf5dc6de6cedb693d26bb1 Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Mon, 7 Apr 2025 14:46:37 +0100
Subject: [PATCH 1/2] [BasicAA] Add some test cases for coerced function args
---
.../test/Analysis/BasicAA/noalias-inttoptr.ll | 48 +++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll b/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
index 24bbcc55b3202..72f9adc5a74bf 100644
--- a/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
+++ b/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
@@ -58,3 +58,51 @@ define void @test5(i64 %Q_as_int) {
store i8 1, ptr %Q
ret void
}
+
+; Verify that extractvalue of a coerced ptr argument array are NoAlias a function local object
+define void @test_extractvalue([2 x ptr] %Q.coerce) {
+ ; CHECK-LABEL: Function: test_extractvalue:
+ ; CHECK: NoAlias: i8* %P, i8* %Q
+ %P = alloca i8
+ %Q = extractvalue [2 x ptr] %Q.coerce, 1
+ store i8 0, ptr %P
+ store i8 1, ptr %Q
+ ret void
+}
+
+; Same as test_extractvalue with an escape of %P
+define void @test_extractvalue_escape([2 x ptr] %Q.coerce) {
+ ; CHECK-LABEL: Function: test_extractvalue_escape:
+ ; CHECK: MayAlias: i8* %P, i8* %Q
+ %P = alloca i8
+ call void @escape(ptr %P)
+ %Q = extractvalue [2 x ptr] %Q.coerce, 1
+ store i8 0, ptr %P
+ store i8 1, ptr %Q
+ ret void
+}
+
+; Verify that extractvalue of a coerced ptr argument array are NoAlias a function local object
+define void @test_extractvalue_int([2 x i64] %Q.coerce) {
+ ; CHECK-LABEL: Function: test_extractvalue_int:
+ ; CHECK: NoAlias: i8* %P, i8* %Q
+ %P = alloca i8
+ %Q_as_int = extractvalue [2 x i64] %Q.coerce, 1
+ %Q = inttoptr i64 %Q_as_int to ptr
+ store i8 0, ptr %P
+ store i8 1, ptr %Q
+ ret void
+}
+
+; Same as test_extractvalue_int with an escape of %P
+define void @test_extractvalue_int_escape([2 x i64] %Q.coerce) {
+ ; CHECK-LABEL: Function: test_extractvalue_int_escape:
+ ; CHECK: MayAlias: i8* %P, i8* %Q
+ %P = alloca i8
+ call void @escape(ptr %P)
+ %Q_as_int = extractvalue [2 x i64] %Q.coerce, 1
+ %Q = inttoptr i64 %Q_as_int to ptr
+ store i8 0, ptr %P
+ store i8 1, ptr %Q
+ ret void
+}
\ No newline at end of file
>From 20cf6b2285b12085b0ecf6ece074f7657c32b640 Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Mon, 7 Apr 2025 20:46:01 +0100
Subject: [PATCH 2/2] [BasicAA] Treat ExtractValue(Argument) similar to
Argument in relation to function-local objects.
This is a much smaller, technically orthoganal patch similar to #134505. It
states that a extractvalue(Argument) can be treated like an Argument for alias
analysis, where the extractelement acts like a phi / copy. No inttotr here. I'm
hoping for this operations this is perfectly sensible, but it is quite a
complex area.
---
llvm/lib/Analysis/BasicAliasAnalysis.cpp | 14 ++++++++++++--
llvm/test/Analysis/BasicAA/noalias-inttoptr.ll | 2 +-
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 4d1a95a0c4b43..12d9c8706a8e1 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -1533,6 +1533,16 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize,
return Alias;
}
+// Return true for an Argument or extractvalue(Argument). These are all known
+// to not alias with FunctionLocal objects and can come up from coerced function
+// arguments.
+static bool isArgumentOrArgumentLike(const Value *V) {
+ if (isa<Argument>(V))
+ return true;
+ auto *E = dyn_cast<ExtractValueInst>(V);
+ return E && isa<Argument>(E->getOperand(0));
+}
+
/// Provides a bunch of ad-hoc rules to disambiguate in common cases, such as
/// array references.
AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size,
@@ -1585,8 +1595,8 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size,
// Function arguments can't alias with things that are known to be
// unambigously identified at the function level.
- if ((isa<Argument>(O1) && isIdentifiedFunctionLocal(O2)) ||
- (isa<Argument>(O2) && isIdentifiedFunctionLocal(O1)))
+ if ((isArgumentOrArgumentLike(O1) && isIdentifiedFunctionLocal(O2)) ||
+ (isArgumentOrArgumentLike(O2) && isIdentifiedFunctionLocal(O1)))
return AliasResult::NoAlias;
// If one pointer is the result of a call/invoke or load and the other is a
diff --git a/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll b/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
index 72f9adc5a74bf..cdfdb091f668f 100644
--- a/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
+++ b/llvm/test/Analysis/BasicAA/noalias-inttoptr.ll
@@ -73,7 +73,7 @@ define void @test_extractvalue([2 x ptr] %Q.coerce) {
; Same as test_extractvalue with an escape of %P
define void @test_extractvalue_escape([2 x ptr] %Q.coerce) {
; CHECK-LABEL: Function: test_extractvalue_escape:
- ; CHECK: MayAlias: i8* %P, i8* %Q
+ ; CHECK: NoAlias: i8* %P, i8* %Q
%P = alloca i8
call void @escape(ptr %P)
%Q = extractvalue [2 x ptr] %Q.coerce, 1
More information about the llvm-commits
mailing list