Skip to content

Commit 92e575d

Browse files
authored
[HLSL] Add SPIR-V version of getPointer. (#121963)
Use the spv version of the resource.getpointer intrinsic when targeting SPIR-V.
1 parent a5c3cbf commit 92e575d

File tree

4 files changed

+19
-7
lines changed

4 files changed

+19
-7
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19212,8 +19212,9 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1921219212
// TODO: Map to an hlsl_device address space.
1921319213
llvm::Type *RetTy = llvm::PointerType::getUnqual(getLLVMContext());
1921419214

19215-
return Builder.CreateIntrinsic(RetTy, Intrinsic::dx_resource_getpointer,
19216-
ArrayRef<Value *>{HandleOp, IndexOp});
19215+
return Builder.CreateIntrinsic(
19216+
RetTy, CGM.getHLSLRuntime().getCreateResourceGetPointerIntrinsic(),
19217+
ArrayRef<Value *>{HandleOp, IndexOp});
1921719218
}
1921819219
case Builtin::BI__builtin_hlsl_all: {
1921919220
Value *Op0 = EmitScalarExpr(E->getArg(0));

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class CGHLSLRuntime {
104104
GENERATE_HLSL_INTRINSIC_FUNCTION(SClamp, sclamp)
105105
GENERATE_HLSL_INTRINSIC_FUNCTION(UClamp, uclamp)
106106

107+
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceGetPointer,
108+
resource_getpointer)
107109
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding,
108110
resource_handlefrombinding)
109111
GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, resource_updatecounter)
Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 %s | FileCheck %s
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-llvm -o - -O0 %s | FileCheck %s --check-prefixes=DXC,CHECK
2+
// RUN: %clang_cc1 -triple spirv1.6-pc-vulkan1.3-compute -emit-llvm -o - -O0 %s | FileCheck %s --check-prefixes=SPIRV,CHECK
23

34
RWBuffer<int> In;
45
RWBuffer<int> Out;
@@ -7,15 +8,19 @@ RWBuffer<int> Out;
78
void main(unsigned GI : SV_GroupIndex) {
89
// CHECK: define void @main()
910

10-
// CHECK: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
11+
// DXC: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
12+
// SPIRV: %[[INPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_i32_5_2_0_0_2_0t(target("spirv.Image", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}})
1113
// CHECK: %[[LOAD:.*]] = load i32, ptr %[[INPTR]]
12-
// CHECK: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
14+
// DXC: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
15+
// SPIRV: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_i32_5_2_0_0_2_0t(target("spirv.Image", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}})
1316
// CHECK: store i32 %[[LOAD]], ptr %[[OUTPTR]]
1417
Out[GI] = In[GI];
1518

16-
// CHECK: %[[INPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
19+
// DXC: %[[INPTR:.*]] = call ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
20+
// SPIRV: %[[INPTR:.*]] = call ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_i32_5_2_0_0_2_0t(target("spirv.Image", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}})
1721
// CHECK: %[[LOAD:.*]] = load i32, ptr %[[INPTR]]
18-
// CHECK: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
22+
// DXC: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.dx.resource.getpointer.p0.tdx.TypedBuffer_i32_1_0_1t(target("dx.TypedBuffer", i32, 1, 0, 1) %{{.*}}, i32 %{{.*}})
23+
// SPIRV: %[[OUTPTR:.*]] = call noundef nonnull align 4 dereferenceable(4) ptr @llvm.spv.resource.getpointer.p0.tspirv.Image_i32_5_2_0_0_2_0t(target("spirv.Image", i32, 5, 2, 0, 0, 2, 0) %{{.*}}, i32 %{{.*}})
1924
// CHECK: store i32 %[[LOAD]], ptr %[[OUTPTR]]
2025
Out[GI] = In.Load(GI);
2126
}

llvm/include/llvm/IR/IntrinsicsSPIRV.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ let TargetPrefix = "spv" in {
118118
: DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_i8_ty],
119119
[IntrInaccessibleMemOrArgMemOnly]>;
120120

121+
def int_spv_resource_getpointer
122+
: DefaultAttrsIntrinsic<[llvm_anyptr_ty], [llvm_any_ty, llvm_i32_ty],
123+
[IntrNoMem]>;
124+
121125
// Read a value from the image buffer. It does not translate directly to a
122126
// single OpImageRead because the result type is not necessarily a 4 element
123127
// vector.

0 commit comments

Comments
 (0)