From a89ea96f1bac93223af3d237e8ad4b9513b5cdec Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak Date: Thu, 25 Sep 2025 23:50:54 +0000 Subject: [PATCH 1/4] [AMDGPU][LowerBufferFatPointers] Erase dead ptr(7) intrinsics Fix a crash that would arise when intrinsics like llvm.masked.load.T.p7 were left in the module when AMDGPULowerBufferFatPointers was applied and so a captures(none) annotation would be applied to a non-pointer value, triggering a verifier failure. --- .../Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp | 4 +++- .../lower-buffer-fat-pointers-dead-intrinsics.ll | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp index d9bfeae52e213..eac3329d00f9b 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp @@ -2562,7 +2562,9 @@ bool AMDGPULowerBufferFatPointers::run(Module &M, const TargetMachine &TM) { for (Function *F : NeedsPostProcess) Splitter.processFunction(*F); for (Function *F : Intrinsics) { - if (isRemovablePointerIntrinsic(F->getIntrinsicID())) { + // use_empty() can also occor with cases like malked load, which will + // have been rewritten out of the module by now but not erased. + if (F->use_empty() || isRemovablePointerIntrinsic(F->getIntrinsicID())) { F->eraseFromParent(); } else { std::optional NewF = Intrinsic::remangleIntrinsicFunction(F); diff --git a/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll new file mode 100644 index 0000000000000..a156ecdc4b53b --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll @@ -0,0 +1,11 @@ +; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s +; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s + +target triple = "amdgcn-amd-amdhsa" + +; CHECK: @arbitrary +declare amdgpu_kernel void @arbitrary(ptr addrspace(1)) + +; COM: This used to cause verifier errors when "lowered" +declare <4 x i8> @llvm.masked.load.v4i8.p7(ptr addrspace(7) captures(none), i32 immarg, <4 x i1>, <4 x i8>) +; CHECK-NOT: llvm.masked.load From f6d50ffbb0ff400af6d6795e2bab2406cdb11264 Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak Date: Fri, 26 Sep 2025 13:05:34 -0500 Subject: [PATCH 2/4] Change run lines Co-authored-by: Shilei Tian --- .../AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll index a156ecdc4b53b..d6198f5000c34 100644 --- a/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll +++ b/llvm/test/CodeGen/AMDGPU/lower-buffer-fat-pointers-dead-intrinsics.ll @@ -1,7 +1,5 @@ -; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s -; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s - -target triple = "amdgcn-amd-amdhsa" +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s +; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s ; CHECK: @arbitrary declare amdgpu_kernel void @arbitrary(ptr addrspace(1)) From 387e9b7f3044d00967d8590a82d5ec70547f92c9 Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak Date: Fri, 26 Sep 2025 18:05:57 +0000 Subject: [PATCH 3/4] Fix typo --- llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp index eac3329d00f9b..de9bc2e77b7fe 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp @@ -2562,7 +2562,7 @@ bool AMDGPULowerBufferFatPointers::run(Module &M, const TargetMachine &TM) { for (Function *F : NeedsPostProcess) Splitter.processFunction(*F); for (Function *F : Intrinsics) { - // use_empty() can also occor with cases like malked load, which will + // use_empty() can also occor with cases like masked load, which will // have been rewritten out of the module by now but not erased. if (F->use_empty() || isRemovablePointerIntrinsic(F->getIntrinsicID())) { F->eraseFromParent(); From 520c37cb4b3a03e9fae2fe48caaff23dfd5a01d3 Mon Sep 17 00:00:00 2001 From: Krzysztof Drewniak Date: Fri, 26 Sep 2025 18:07:22 +0000 Subject: [PATCH 4/4] Fix the other typo --- llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp index de9bc2e77b7fe..0a5913293238a 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerBufferFatPointers.cpp @@ -2562,7 +2562,7 @@ bool AMDGPULowerBufferFatPointers::run(Module &M, const TargetMachine &TM) { for (Function *F : NeedsPostProcess) Splitter.processFunction(*F); for (Function *F : Intrinsics) { - // use_empty() can also occor with cases like masked load, which will + // use_empty() can also occur with cases like masked load, which will // have been rewritten out of the module by now but not erased. if (F->use_empty() || isRemovablePointerIntrinsic(F->getIntrinsicID())) { F->eraseFromParent();