[llvm] [AMDGPU] Guard intrinsics that need vmem-to-lds-load-insts (PR #214842)
Shilei Tian via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 7 13:04:41 PDT 2026
https://github.com/shiltian updated https://github.com/llvm/llvm-project/pull/214842
>From f7d028901181641f3eab5da2a69cc4af3c3e1681 Mon Sep 17 00:00:00 2001
From: Shilei Tian <i at tianshilei.me>
Date: Fri, 7 Aug 2026 15:53:56 -0400
Subject: [PATCH] [AMDGPU] Guard intrinsics that need vmem-to-lds-load-insts
---
llvm/include/llvm/IR/IntrinsicsAMDGPU.td | 36 ++++++++++++-------
llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 2 --
.../AMDGPU/llvm.amdgcn.buffer.load.lds.err.ll | 34 ++++++++++++------
3 files changed, 48 insertions(+), 24 deletions(-)
diff --git a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
index 9c57b4d343fc6..4ca50ff95eeca 100644
--- a/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
+++ b/llvm/include/llvm/IR/IntrinsicsAMDGPU.td
@@ -2071,8 +2071,11 @@ class AMDGPURawBufferLoadLDS : Intrinsic <
// all: volatile op (bit 31, stripped at lowering)
[IntrWillReturn, NoCapture<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<5>>,
ImmArg<ArgIndex<6>>, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<0>;
-def int_amdgcn_raw_buffer_load_lds : AMDGPURawBufferLoadLDS;
-def int_amdgcn_raw_buffer_load_async_lds : AMDGPURawBufferLoadLDS;
+
+let TargetFeatures = "vmem-to-lds-load-insts" in {
+ def int_amdgcn_raw_buffer_load_lds : AMDGPURawBufferLoadLDS;
+ def int_amdgcn_raw_buffer_load_async_lds : AMDGPURawBufferLoadLDS;
+} // End TargetFeatures = "vmem-to-lds-load-insts"
class AMDGPURawPtrBufferLoadLDS :
Intrinsic <
@@ -2095,10 +2098,13 @@ class AMDGPURawPtrBufferLoadLDS :
WriteOnly<ArgIndex<1>>, NoCapture<ArgIndex<1>>,
ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<5>>,
ImmArg<ArgIndex<6>>, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<0>;
-def int_amdgcn_raw_ptr_buffer_load_lds : AMDGPURawPtrBufferLoadLDS,
- ClangBuiltin<"__builtin_amdgcn_raw_ptr_buffer_load_lds">;
-def int_amdgcn_raw_ptr_buffer_load_async_lds : AMDGPURawPtrBufferLoadLDS,
- ClangBuiltin<"__builtin_amdgcn_raw_ptr_buffer_load_async_lds">;
+
+let TargetFeatures = "vmem-to-lds-load-insts" in {
+ def int_amdgcn_raw_ptr_buffer_load_lds : AMDGPURawPtrBufferLoadLDS,
+ ClangBuiltin<"__builtin_amdgcn_raw_ptr_buffer_load_lds">;
+ def int_amdgcn_raw_ptr_buffer_load_async_lds : AMDGPURawPtrBufferLoadLDS,
+ ClangBuiltin<"__builtin_amdgcn_raw_ptr_buffer_load_async_lds">;
+} // End TargetFeatures = "vmem-to-lds-load-insts"
class AMDGPUStructBufferLoadLDS : Intrinsic <
@@ -2119,8 +2125,11 @@ class AMDGPUStructBufferLoadLDS : Intrinsic <
// all: volatile op (bit 31, stripped at lowering)
[IntrWillReturn, NoCapture<ArgIndex<1>>, ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<6>>,
ImmArg<ArgIndex<7>>, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<0>;
-def int_amdgcn_struct_buffer_load_lds : AMDGPUStructBufferLoadLDS;
-def int_amdgcn_struct_buffer_load_async_lds : AMDGPUStructBufferLoadLDS;
+
+let TargetFeatures = "vmem-to-lds-load-insts" in {
+ def int_amdgcn_struct_buffer_load_lds : AMDGPUStructBufferLoadLDS;
+ def int_amdgcn_struct_buffer_load_async_lds : AMDGPUStructBufferLoadLDS;
+} // End TargetFeatures = "vmem-to-lds-load-insts"
class AMDGPUStructPtrBufferLoadLDS :
Intrinsic <
@@ -2144,10 +2153,13 @@ class AMDGPUStructPtrBufferLoadLDS :
WriteOnly<ArgIndex<1>>, NoCapture<ArgIndex<1>>,
ImmArg<ArgIndex<2>>, ImmArg<ArgIndex<6>>,
ImmArg<ArgIndex<7>>, IntrNoCallback, IntrNoFree], "", [SDNPMemOperand]>, AMDGPURsrcIntrinsic<0>;
-def int_amdgcn_struct_ptr_buffer_load_lds : AMDGPUStructPtrBufferLoadLDS,
- ClangBuiltin<"__builtin_amdgcn_struct_ptr_buffer_load_lds">;
-def int_amdgcn_struct_ptr_buffer_load_async_lds : AMDGPUStructPtrBufferLoadLDS,
- ClangBuiltin<"__builtin_amdgcn_struct_ptr_buffer_load_async_lds">;
+
+let TargetFeatures = "vmem-to-lds-load-insts" in {
+ def int_amdgcn_struct_ptr_buffer_load_lds : AMDGPUStructPtrBufferLoadLDS,
+ ClangBuiltin<"__builtin_amdgcn_struct_ptr_buffer_load_lds">;
+ def int_amdgcn_struct_ptr_buffer_load_async_lds : AMDGPUStructPtrBufferLoadLDS,
+ ClangBuiltin<"__builtin_amdgcn_struct_ptr_buffer_load_async_lds">;
+} // End TargetFeatures = "vmem-to-lds-load-insts"
def int_amdgcn_s_buffer_prefetch_data : DefaultAttrsIntrinsic <
[],
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 1d54903b18def..1d165910adeba 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -12721,8 +12721,6 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
case Intrinsic::amdgcn_struct_buffer_load_async_lds:
case Intrinsic::amdgcn_struct_ptr_buffer_load_lds:
case Intrinsic::amdgcn_struct_ptr_buffer_load_async_lds: {
- if (!Subtarget->hasVMemToLDSLoad())
- return SDValue();
unsigned Opc;
bool HasVIndex =
IntrinsicID == Intrinsic::amdgcn_struct_buffer_load_lds ||
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.buffer.load.lds.err.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.buffer.load.lds.err.ll
index 44a7a9826163c..833d6416dc28d 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.buffer.load.lds.err.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.buffer.load.lds.err.ll
@@ -1,16 +1,30 @@
; RUN: split-file %s %t
;
-; RUN: not --crash llc -mtriple=amdgpu11.00 %t/struct.ll 2>&1 | FileCheck --ignore-case %s
-; RUN: not llc -global-isel -mtriple=amdgpu11.00 %t/struct.ll 2>&1 | FileCheck --ignore-case %s
-; RUN: not --crash llc -mtriple=amdgpu11.00 %t/struct.ptr.ll 2>&1 | FileCheck --ignore-case --check-prefix=LEGALIZER-FAIL %s
-; RUN: not llc -global-isel -mtriple=amdgpu11.00 %t/struct.ptr.ll 2>&1 | FileCheck --ignore-case %s
-; RUN: not --crash llc -mtriple=amdgpu11.00 %t/raw.ll 2>&1 | FileCheck --ignore-case %s
-; RUN: not llc -global-isel -mtriple=amdgpu11.00 %t/raw.ll 2>&1 | FileCheck --ignore-case %s
-; RUN: not --crash llc -mtriple=amdgpu11.00 %t/raw.ptr.ll 2>&1 | FileCheck --ignore-case --check-prefix=LEGALIZER-FAIL %s
-; RUN: not llc -global-isel -mtriple=amdgpu11.00 %t/raw.ptr.ll 2>&1 | FileCheck --ignore-case %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ll 2>&1 | FileCheck --check-prefix=STRUCT %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ll 2>&1 | FileCheck --check-prefix=STRUCT %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.async.ll 2>&1 | FileCheck --check-prefix=STRUCT-ASYNC %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.async.ll 2>&1 | FileCheck --check-prefix=STRUCT-ASYNC %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ptr.ll 2>&1 | FileCheck --check-prefix=STRUCT-PTR %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ptr.ll 2>&1 | FileCheck --check-prefix=STRUCT-PTR %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ptr.async.ll 2>&1 | FileCheck --check-prefix=STRUCT-PTR-ASYNC %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/struct.ptr.async.ll 2>&1 | FileCheck --check-prefix=STRUCT-PTR-ASYNC %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ll 2>&1 | FileCheck --check-prefix=RAW %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ll 2>&1 | FileCheck --check-prefix=RAW %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.async.ll 2>&1 | FileCheck --check-prefix=RAW-ASYNC %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.async.ll 2>&1 | FileCheck --check-prefix=RAW-ASYNC %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ptr.ll 2>&1 | FileCheck --check-prefix=RAW-PTR %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ptr.ll 2>&1 | FileCheck --check-prefix=RAW-PTR %s
+; RUN: not llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ptr.async.ll 2>&1 | FileCheck --check-prefix=RAW-PTR-ASYNC %s
+; RUN: not llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1250 -filetype=null < %t/raw.ptr.async.ll 2>&1 | FileCheck --check-prefix=RAW-PTR-ASYNC %s
;
-; CHECK: LLVM ERROR: Cannot select
-; LEGALIZER-FAIL: Do not know how to expand this operator's operand!
+; STRUCT: llvm.amdgcn.struct.buffer.load.lds requires target feature 'vmem-to-lds-load-insts'
+; STRUCT-ASYNC: llvm.amdgcn.struct.buffer.load.async.lds requires target feature 'vmem-to-lds-load-insts'
+; STRUCT-PTR: llvm.amdgcn.struct.ptr.buffer.load.lds requires target feature 'vmem-to-lds-load-insts'
+; STRUCT-PTR-ASYNC: llvm.amdgcn.struct.ptr.buffer.load.async.lds requires target feature 'vmem-to-lds-load-insts'
+; RAW: llvm.amdgcn.raw.buffer.load.lds requires target feature 'vmem-to-lds-load-insts'
+; RAW-ASYNC: llvm.amdgcn.raw.buffer.load.async.lds requires target feature 'vmem-to-lds-load-insts'
+; RAW-PTR: llvm.amdgcn.raw.ptr.buffer.load.lds requires target feature 'vmem-to-lds-load-insts'
+; RAW-PTR-ASYNC: llvm.amdgcn.raw.ptr.buffer.load.async.lds requires target feature 'vmem-to-lds-load-insts'
;--- struct.ll
define amdgpu_ps void @buffer_load_lds(<4 x i32> inreg %rsrc, ptr addrspace(3) inreg %lds) {
More information about the llvm-commits
mailing list