[llvm] 9cf2465 - [AMDGPU] Fix spurious NoAlias results (#122309)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 20 06:19:34 PST 2025
Author: Fraser Cormack
Date: 2025-01-20T14:19:30Z
New Revision: 9cf24652e783147b5063925ce025b9f8a6e8fe25
URL: https://github.com/llvm/llvm-project/commit/9cf24652e783147b5063925ce025b9f8a6e8fe25
DIFF: https://github.com/llvm/llvm-project/commit/9cf24652e783147b5063925ce025b9f8a6e8fe25.diff
LOG: [AMDGPU] Fix spurious NoAlias results (#122309)
After a30e50fc, AMDGPUAAResult is being called in more situations where
BasicAA isn't sure. This exposed some regressions where NoAlias is being
incorrectly returned for two identical pointers.
The fix is to check the underlying objects for equality before returning
NoAlias.
Added:
Modified:
llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.cpp
llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.cpp
index 8d3eac6868318e..5a6868f96d970e 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAliasAnalysis.cpp
@@ -80,10 +80,14 @@ AliasResult AMDGPUAAResult::alias(const MemoryLocation &LocA,
} else if (const Argument *Arg = dyn_cast<Argument>(ObjA)) {
const Function *F = Arg->getParent();
switch (F->getCallingConv()) {
- case CallingConv::AMDGPU_KERNEL:
+ case CallingConv::AMDGPU_KERNEL: {
// In the kernel function, kernel arguments won't alias to (local)
// variables in shared or private address space.
- return AliasResult::NoAlias;
+ const auto *ObjB =
+ getUnderlyingObject(B.Ptr->stripPointerCastsForAliasAnalysis());
+ return ObjA != ObjB && isIdentifiedObject(ObjB) ? AliasResult::NoAlias
+ : AliasResult::MayAlias;
+ }
default:
// TODO: In the regular function, if that local variable in the
// location B is not captured, that argument pointer won't alias to it
diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll
index a13eb5c6d085f8..6b935a8768d3dc 100644
--- a/llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll
+++ b/llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll
@@ -318,3 +318,20 @@ define void @test_9_9(ptr addrspace(9) %p, ptr addrspace(9) %p1) {
load i8, ptr addrspace(9) %p1
ret void
}
+
+; CHECK-LABEL: Function: test_kernel_arg_local_ptr
+; CHECK: MayAlias: i32 addrspace(3)* %arg, i32 addrspace(3)* %arg1
+; CHECK: MayAlias: i32 addrspace(3)* %arg, i32* %arg2
+; CHECK: MayAlias: i32 addrspace(3)* %arg1, i32* %arg2
+define amdgpu_kernel void @test_kernel_arg_local_ptr(ptr addrspace(3) %arg) {
+entry:
+ %load1 = load i32, ptr addrspace(3) %arg, align 4
+ %arg.plus.1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 1
+ %arg1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg.plus.1, i64 -1
+ %load2 = load i32, ptr addrspace(3) %arg1, align 4
+ %arg.plus.4 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 4
+ %acast = addrspacecast ptr addrspace(3) %arg.plus.4 to ptr
+ %arg2 = getelementptr inbounds i8, ptr %acast, i64 -4
+ %load3 = load i32, ptr %arg2, align 4
+ ret void
+}
More information about the llvm-commits
mailing list