[llvm] [AMDGPU] Propagate amdgpu-agpr-alloc to ASan runtime calls in SwLowerLDS (PR #195915)
Pablo Reble via llvm-commits
llvm-commits at lists.llvm.org
Tue May 5 20:08:46 PDT 2026
https://github.com/reble updated https://github.com/llvm/llvm-project/pull/195915
>From 016dd6ad050238f5c2b08a4bb9a9e166c57cefe4 Mon Sep 17 00:00:00 2001
From: Pablo Reble <pablo.reble at amd.com>
Date: Tue, 5 May 2026 12:33:33 -0500
Subject: [PATCH 1/3] [AMDGPU] Propagate amdgpu-agpr-alloc to ASan runtime
calls in SwLowerLDS
---
llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
index ccf6e328b4cbf..04d894fce010c 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
@@ -210,6 +210,7 @@ class AMDGPUSwLowerLDS {
Value *HiddenDynLDSSize,
SetVector<GlobalVariable *> &DynamicLDSGlobals);
void initAsanInfo();
+ void propagateAsanAttrs(Function *KernelFunc, FunctionCallee& Callee);
private:
Module &M;
@@ -744,6 +745,19 @@ void AMDGPUSwLowerLDS::translateLDSMemoryOperationsToGlobalMemory(
}
}
+void AMDGPUSwLowerLDS::propagateAsanAttrs(Function *KernelFunc,
+ FunctionCallee& Callee) {
+ auto *F = dyn_cast<Function>(Callee.getCallee());
+ if (!F)
+ return;
+ const GCNSubtarget &ST = AMDGPUTM.getSubtarget<GCNSubtarget>(*KernelFunc);
+ if (!ST.hasGFX90AInsts())
+ return;
+ Attribute AGPRAlloc = KernelFunc->getFnAttribute("amdgpu-agpr-alloc");
+ if (AGPRAlloc.isValid())
+ F->addFnAttr(AGPRAlloc);
+}
+
void AMDGPUSwLowerLDS::poisonRedzones(Function *Func, Value *MallocPtr) {
auto &LDSParams = FuncLDSAccessInfo.KernelToLDSParametersMap[Func];
Type *Int64Ty = IRB.getInt64Ty();
@@ -751,6 +765,7 @@ void AMDGPUSwLowerLDS::poisonRedzones(Function *Func, Value *MallocPtr) {
FunctionCallee AsanPoisonRegion = M.getOrInsertFunction(
"__asan_poison_region",
FunctionType::get(VoidTy, {Int64Ty, Int64Ty}, false));
+ propagateAsanAttrs(Func, AsanPoisonRegion);
auto RedzonesVec = LDSParams.RedzoneOffsetAndSizeVector;
size_t VecSize = RedzonesVec.size();
@@ -887,6 +902,7 @@ void AMDGPUSwLowerLDS::lowerKernelLDSAccesses(Function *Func,
FunctionCallee MallocFunc = M.getOrInsertFunction(
StringRef("__asan_malloc_impl"),
FunctionType::get(Int64Ty, {Int64Ty, Int64Ty}, false));
+ propagateAsanAttrs(Func, MallocFunc);
Value *RAPtrToInt = IRB.CreatePtrToInt(ReturnAddress, Int64Ty);
Value *MallocCall = IRB.CreateCall(MallocFunc, {CurrMallocSize, RAPtrToInt});
@@ -948,6 +964,7 @@ void AMDGPUSwLowerLDS::lowerKernelLDSAccesses(Function *Func,
FunctionCallee AsanFreeFunc = M.getOrInsertFunction(
StringRef("__asan_free_impl"),
FunctionType::get(IRB.getVoidTy(), {Int64Ty, Int64Ty}, false));
+ propagateAsanAttrs(Func, AsanFreeFunc);
Value *ReturnAddr = IRB.CreateIntrinsic(
Intrinsic::returnaddress, IRB.getPtrTy(DL.getProgramAddressSpace()),
IRB.getInt32(0));
>From 8619de2566c1455d3e4446bfc6208d1bc52d23f3 Mon Sep 17 00:00:00 2001
From: Pablo Reble <pablo.reble at amd.com>
Date: Tue, 5 May 2026 14:30:14 -0500
Subject: [PATCH 2/3] fix formatting
---
llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
index 04d894fce010c..810deee5f874f 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUSwLowerLDS.cpp
@@ -210,7 +210,7 @@ class AMDGPUSwLowerLDS {
Value *HiddenDynLDSSize,
SetVector<GlobalVariable *> &DynamicLDSGlobals);
void initAsanInfo();
- void propagateAsanAttrs(Function *KernelFunc, FunctionCallee& Callee);
+ void propagateAsanAttrs(Function *KernelFunc, FunctionCallee &Callee);
private:
Module &M;
@@ -746,7 +746,7 @@ void AMDGPUSwLowerLDS::translateLDSMemoryOperationsToGlobalMemory(
}
void AMDGPUSwLowerLDS::propagateAsanAttrs(Function *KernelFunc,
- FunctionCallee& Callee) {
+ FunctionCallee &Callee) {
auto *F = dyn_cast<Function>(Callee.getCallee());
if (!F)
return;
>From bd62b1fcf623bb633f017960c4de8ed7915273b6 Mon Sep 17 00:00:00 2001
From: Pablo Reble <pablo.reble at amd.com>
Date: Tue, 5 May 2026 22:08:22 -0500
Subject: [PATCH 3/3] Adding test
---
.../amdgpu-sw-lower-lds-agpr-alloc-asan.ll | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 llvm/test/CodeGen/AMDGPU/amdgpu-sw-lower-lds-agpr-alloc-asan.ll
diff --git a/llvm/test/CodeGen/AMDGPU/amdgpu-sw-lower-lds-agpr-alloc-asan.ll b/llvm/test/CodeGen/AMDGPU/amdgpu-sw-lower-lds-agpr-alloc-asan.ll
new file mode 100644
index 0000000000000..d222d1baa0a3d
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/amdgpu-sw-lower-lds-agpr-alloc-asan.ll
@@ -0,0 +1,30 @@
+; RUN: opt < %s -passes=amdgpu-sw-lower-lds -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a \
+; RUN: | FileCheck %s --check-prefix=GFX90A
+; RUN: opt < %s -passes=amdgpu-sw-lower-lds -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 \
+; RUN: | FileCheck %s --check-prefix=NOGFX90A
+
+; Test that amdgpu-agpr-alloc is propagated to __asan_malloc_impl,
+; __asan_free_impl, and __asan_poison_region only on gfx90a targets.
+
+ at lds_1 = internal addrspace(3) global i32 poison, align 4
+
+define amdgpu_kernel void @k0() sanitize_address #0 {
+ store i32 1, ptr addrspace(3) @lds_1, align 4
+ ret void
+}
+
+; GFX90A: declare i64 @__asan_malloc_impl(i64, i64) #[[AGPR_ATTR:[0-9]+]]
+; GFX90A: declare void @__asan_poison_region(i64, i64) #[[AGPR_ATTR]]
+; GFX90A: declare void @__asan_free_impl(i64, i64) #[[AGPR_ATTR]]
+
+; GFX90A: attributes #[[AGPR_ATTR]] = { "amdgpu-agpr-alloc"="0" }
+
+; NOGFX90A-NOT: declare i64 @__asan_malloc_impl{{.*}}"amdgpu-agpr-alloc"
+; NOGFX90A-NOT: declare void @__asan_poison_region{{.*}}"amdgpu-agpr-alloc"
+; NOGFX90A-NOT: declare void @__asan_free_impl{{.*}}"amdgpu-agpr-alloc"
+
+attributes #0 = { sanitize_address "amdgpu-agpr-alloc"="0" }
+
+!llvm.module.flags = !{!0}
+!0 = !{i32 4, !"nosanitize_address", i32 1}
+
More information about the llvm-commits
mailing list