Skip to content

Commit 118199b

Browse files
YuriPlyakhinjsji
authored andcommitted
1 parent a75620b commit 118199b

File tree

6 files changed

+143
-1
lines changed

6 files changed

+143
-1
lines changed

llvm-spirv/include/LLVMSPIRVExtensions.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,4 @@ EXT(SPV_INTEL_subgroup_requirements)
7474
EXT(SPV_INTEL_task_sequence)
7575
EXT(SPV_INTEL_maximum_registers)
7676
EXT(SPV_INTEL_bindless_images)
77+
EXT(SPV_INTEL_2d_block_io)

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVInstruction.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4383,5 +4383,50 @@ class SPIRVUntypedPrefetchKHR : public SPIRVInstruction {
43834383
std::vector<SPIRVId> CacheTy;
43844384
};
43854385

4386+
class SPIRVSubgroup2DBlockIOINTELInst : public SPIRVInstTemplateBase {
4387+
public:
4388+
std::optional<ExtensionID> getRequiredExtension() const override {
4389+
return ExtensionID::SPV_INTEL_2d_block_io;
4390+
}
4391+
SPIRVCapVec getRequiredCapability() const override {
4392+
return getVec(CapabilitySubgroup2DBlockIOINTEL);
4393+
}
4394+
};
4395+
4396+
class SPIRVSubgroup2DBlockLoadTransposeINTELInst
4397+
: public SPIRVSubgroup2DBlockIOINTELInst {
4398+
SPIRVCapVec getRequiredCapability() const override {
4399+
return getVec(CapabilitySubgroup2DBlockTransposeINTEL);
4400+
}
4401+
};
4402+
4403+
class SPIRVSubgroup2DBlockLoadTransformINTELInst
4404+
: public SPIRVSubgroup2DBlockIOINTELInst {
4405+
SPIRVCapVec getRequiredCapability() const override {
4406+
return getVec(CapabilitySubgroup2DBlockTransformINTEL);
4407+
}
4408+
};
4409+
4410+
#define _SPIRV_OP(x, ...) \
4411+
typedef SPIRVInstTemplate<SPIRVSubgroup2DBlockIOINTELInst, Op##x##INTEL, \
4412+
__VA_ARGS__> \
4413+
SPIRV##x##INTEL;
4414+
_SPIRV_OP(Subgroup2DBlockLoad, false, 11)
4415+
_SPIRV_OP(Subgroup2DBlockPrefetch, false, 10)
4416+
_SPIRV_OP(Subgroup2DBlockStore, false, 11)
4417+
#undef _SPIRV_OP
4418+
#define _SPIRV_OP(x, ...) \
4419+
typedef SPIRVInstTemplate<SPIRVSubgroup2DBlockLoadTransposeINTELInst, \
4420+
Op##x##INTEL, __VA_ARGS__> \
4421+
SPIRV##x##INTEL;
4422+
_SPIRV_OP(Subgroup2DBlockLoadTranspose, false, 11)
4423+
#undef _SPIRV_OP
4424+
#define _SPIRV_OP(x, ...) \
4425+
typedef SPIRVInstTemplate<SPIRVSubgroup2DBlockLoadTransformINTELInst, \
4426+
Op##x##INTEL, __VA_ARGS__> \
4427+
SPIRV##x##INTEL;
4428+
_SPIRV_OP(Subgroup2DBlockLoadTransform, false, 11)
4429+
#undef _SPIRV_OP
4430+
43864431
} // namespace SPIRV
43874432
#endif // SPIRV_LIBSPIRV_SPIRVINSTRUCTION_H

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVNameMapEnum.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,9 @@ template <> inline void SPIRVMap<Capability, std::string>::init() {
656656
add(CapabilityFPMaxErrorINTEL, "FPMaxErrorINTEL");
657657
add(CapabilityRegisterLimitsINTEL, "RegisterLimitsINTEL");
658658
add(CapabilityArithmeticFenceEXT, "ArithmeticFenceEXT");
659+
add(CapabilitySubgroup2DBlockIOINTEL, "Subgroup2DBlockIOINTEL");
660+
add(CapabilitySubgroup2DBlockTransformINTEL, "Subgroup2DBlockTransformINTEL");
661+
add(CapabilitySubgroup2DBlockTransposeINTEL, "Subgroup2DBlockTransposeINTEL");
659662
// From spirv_internal.hpp
660663
add(internal::CapabilityFastCompositeINTEL, "FastCompositeINTEL");
661664
add(internal::CapabilityOptNoneINTEL, "OptNoneINTEL");

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,11 @@ _SPIRV_OP(ConvertBF16ToFINTEL, 6117)
573573
_SPIRV_OP(ControlBarrierArriveINTEL, 6142)
574574
_SPIRV_OP(ControlBarrierWaitINTEL, 6143)
575575
_SPIRV_OP(ArithmeticFenceEXT, 6145)
576+
_SPIRV_OP(Subgroup2DBlockLoadINTEL, 6231)
577+
_SPIRV_OP(Subgroup2DBlockLoadTransformINTEL, 6232)
578+
_SPIRV_OP(Subgroup2DBlockLoadTransposeINTEL, 6233)
579+
_SPIRV_OP(Subgroup2DBlockPrefetchINTEL, 6234)
580+
_SPIRV_OP(Subgroup2DBlockStoreINTEL, 6235)
576581
_SPIRV_OP(GroupIMulKHR, 6401)
577582
_SPIRV_OP(GroupFMulKHR, 6402)
578583
_SPIRV_OP(GroupBitwiseAndKHR, 6403)

llvm-spirv/spirv-headers-tag.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3f17b2af6784bfa2c5aa5dbb8e0e74a607dd8b3b
1+
2b2e05e088841c63c0b6fd4c9fb380d8688738d3
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; Generated with:
2+
; source.cl:
3+
; void __spirv_Subgroup2DBlockLoadINTEL( int element_size, int block_width, int block_height, int block_count, const __global void* src_base_pointer, int memory_width, int memory_height, int memory_pitch, int2 coordinate, private void* dst_pointer);
4+
; void __spirv_Subgroup2DBlockLoadTransposeINTEL(int element_size, int block_width, int block_height, int block_count, const __global void* src_base_pointer, int memory_width, int memory_height, int memory_pitch, int2 coordinate, private void* dst_pointer);
5+
; void __spirv_Subgroup2DBlockLoadTransformINTEL(int element_size, int block_width, int block_height, int block_count, const __global void* src_base_pointer, int memory_width, int memory_height, int memory_pitch, int2 coordinate, private void* dst_pointer);
6+
; void __spirv_Subgroup2DBlockPrefetchINTEL( int element_size, int block_width, int block_height, int block_count, const __global void* src_base_pointer, int memory_width, int memory_height, int memory_pitch, int2 coordinate );
7+
; void __spirv_Subgroup2DBlockStoreINTEL( int element_size, int block_width, int block_height, int block_count, const private void* src_pointer, __global void* dst_base_pointer, int memory_width, int memory_height, int memory_pitch, int2 coordinate );
8+
;
9+
; void foo(const __global void* base_address, __global void* dst_base_pointer, int width, int height, int pitch, int2 coord, private void* dst_pointer, const private void* src_pointer) {
10+
; const int i = 42;
11+
; __spirv_Subgroup2DBlockLoadINTEL(i, i, i, i, base_address, width, height, pitch, coord, dst_pointer);
12+
; __spirv_Subgroup2DBlockLoadTransformINTEL(i, i, i, i, base_address, width, height, pitch, coord, dst_pointer);
13+
; __spirv_Subgroup2DBlockLoadTransposeINTEL(i, i, i, i, base_address, width, height, pitch, coord, dst_pointer);
14+
; __spirv_Subgroup2DBlockPrefetchINTEL(i, i, i, i, base_address, width, height, pitch, coord);
15+
; __spirv_Subgroup2DBlockStoreINTEL(i, i, i, i, src_pointer, dst_base_pointer, width, height, pitch, coord);
16+
; }
17+
; clang -cc1 -cl-std=clc++2021 -triple spir64-unknown-unknown -emit-llvm -finclude-default-header source.cl -o tmp.ll
18+
19+
; RUN: llvm-as %s -o %t.bc
20+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_INTEL_2d_block_io
21+
; RUN: llvm-spirv %t.spv -o %t.spt --to-text
22+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
23+
24+
; RUN: llvm-spirv %t.spv -o %t.rev.bc -r --spirv-target-env=SPV-IR
25+
; RUN: llvm-dis %t.rev.bc -o %t.rev.ll
26+
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
27+
28+
; RUN: not llvm-spirv %t.bc 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
29+
; CHECK-ERROR: RequiresExtension: Feature requires the following SPIR-V extension:
30+
; CHECK-ERROR-NEXT: SPV_INTEL_2d_block_io
31+
32+
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024"
33+
target triple = "spir64-unknown-unknown"
34+
35+
; CHECK-SPIRV: Capability Subgroup2DBlockIOINTEL
36+
; CHECK-SPIRV: Capability Subgroup2DBlockTransformINTEL
37+
; CHECK-SPIRV: Capability Subgroup2DBlockTransposeINTEL
38+
; CHECK-SPIRV: Extension "SPV_INTEL_2d_block_io"
39+
; CHECK-SPIRV-DAG: TypeInt [[#Int8Ty:]] 8 0
40+
; CHECK-SPIRV-DAG: TypeInt [[#Int32Ty:]] 32 0
41+
; CHECK-SPIRV-DAG: Constant [[#Int32Ty]] [[#Const42:]] 42
42+
; CHECK-SPIRV-DAG: TypeVoid [[#VoidTy:]]
43+
; CHECK-SPIRV-DAG: TypePointer [[#GlbPtrTy:]] 5 [[#Int8Ty]]
44+
; CHECK-SPIRV-DAG: TypeVector [[#VectorTy:]] [[#Int32Ty]] 2
45+
; CHECK-SPIRV-DAG: TypePointer [[#PrvPtrTy:]] 7 [[#Int8Ty]]
46+
; CHECK-SPIRV: FunctionParameter [[#GlbPtrTy]] [[#BaseSrc:]]
47+
; CHECK-SPIRV: FunctionParameter [[#GlbPtrTy]] [[#BaseDst:]]
48+
; CHECK-SPIRV: FunctionParameter [[#Int32Ty]] [[#Width:]]
49+
; CHECK-SPIRV: FunctionParameter [[#Int32Ty]] [[#Height:]]
50+
; CHECK-SPIRV: FunctionParameter [[#Int32Ty]] [[#Pitch:]]
51+
; CHECK-SPIRV: FunctionParameter [[#VectorTy]] [[#Coord:]]
52+
; CHECK-SPIRV: FunctionParameter [[#PrvPtrTy]] [[#Dst:]]
53+
; CHECK-SPIRV: FunctionParameter [[#PrvPtrTy]] [[#Src:]]
54+
; CHECK-SPIRV: Subgroup2DBlockLoadINTEL [[#Const42]] [[#Const42]] [[#Const42]] [[#Const42]] [[#BaseSrc]] [[#Width]] [[#Height]] [[#Pitch]] [[#Coord]] [[#Dst]]
55+
; CHECK-SPIRV: Subgroup2DBlockLoadTransformINTEL [[#Const42]] [[#Const42]] [[#Const42]] [[#Const42]] [[#BaseSrc]] [[#Width]] [[#Height]] [[#Pitch]] [[#Coord]] [[#Dst]]
56+
; CHECK-SPIRV: Subgroup2DBlockLoadTransposeINTEL [[#Const42]] [[#Const42]] [[#Const42]] [[#Const42]] [[#BaseSrc]] [[#Width]] [[#Height]] [[#Pitch]] [[#Coord]] [[#Dst]]
57+
; CHECK-SPIRV: Subgroup2DBlockPrefetchINTEL [[#Const42]] [[#Const42]] [[#Const42]] [[#Const42]] [[#BaseSrc]] [[#Width]] [[#Height]] [[#Pitch]] [[#Coord]]
58+
; CHECK-SPIRV: Subgroup2DBlockStoreINTEL [[#Const42]] [[#Const42]] [[#Const42]] [[#Const42]] [[#Src]] [[#BaseDst]] [[#Width]] [[#Height]] [[#Pitch]] [[#Coord]]
59+
60+
; CHECK-LLVM: call spir_func void @_Z32__spirv_Subgroup2DBlockLoadINTELiiiiPU3AS1ciiiDv2_iPc(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, <2 x i32> %{{.*}}, ptr %{{.*}})
61+
; CHECK-LLVM: call spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransformINTELiiiiPU3AS1ciiiDv2_iPc(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, <2 x i32> %{{.*}}, ptr %{{.*}})
62+
; CHECK-LLVM: call spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransposeINTELiiiiPU3AS1ciiiDv2_iPc(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, <2 x i32> %{{.*}}, ptr %{{.*}})
63+
; CHECK-LLVM: call spir_func void @_Z36__spirv_Subgroup2DBlockPrefetchINTELiiiiPU3AS1ciiiDv2_i(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, <2 x i32> %{{.*}})
64+
; CHECK-LLVM: call spir_func void @_Z33__spirv_Subgroup2DBlockStoreINTELiiiiPcPU3AS1ciiiDv2_i(i32 42, i32 42, i32 42, i32 42, ptr %{{.*}}, ptr addrspace(1) %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, <2 x i32> %{{.*}})
65+
66+
define spir_func void @foo(ptr addrspace(1) %base_address, ptr addrspace(1) %dst_base_pointer, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord, ptr %dst_pointer, ptr %src_pointer) {
67+
entry:
68+
call spir_func void @_Z32__spirv_Subgroup2DBlockLoadINTELiiiiPU3AS1KviiiDv2_iPv(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %base_address, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord, ptr %dst_pointer)
69+
call spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransformINTELiiiiPU3AS1KviiiDv2_iPv(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %base_address, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord, ptr %dst_pointer)
70+
call spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransposeINTELiiiiPU3AS1KviiiDv2_iPv(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %base_address, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord, ptr %dst_pointer)
71+
call spir_func void @_Z36__spirv_Subgroup2DBlockPrefetchINTELiiiiPU3AS1KviiiDv2_i(i32 42, i32 42, i32 42, i32 42, ptr addrspace(1) %base_address, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord)
72+
call spir_func void @_Z33__spirv_Subgroup2DBlockStoreINTELiiiiPKvPU3AS1viiiDv2_i(i32 42, i32 42, i32 42, i32 42, ptr %src_pointer, ptr addrspace(1) %dst_base_pointer, i32 %width, i32 %height, i32 %pitch, <2 x i32> %coord)
73+
ret void
74+
}
75+
76+
declare spir_func void @_Z32__spirv_Subgroup2DBlockLoadINTELiiiiPU3AS1KviiiDv2_iPv(i32, i32, i32, i32, ptr addrspace(1), i32, i32, i32, <2 x i32>, ptr)
77+
declare spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransformINTELiiiiPU3AS1KviiiDv2_iPv(i32, i32, i32, i32, ptr addrspace(1), i32, i32, i32, <2 x i32>, ptr)
78+
declare spir_func void @_Z41__spirv_Subgroup2DBlockLoadTransposeINTELiiiiPU3AS1KviiiDv2_iPv(i32, i32, i32, i32, ptr addrspace(1), i32, i32, i32, <2 x i32>, ptr)
79+
declare spir_func void @_Z36__spirv_Subgroup2DBlockPrefetchINTELiiiiPU3AS1KviiiDv2_i(i32, i32, i32, i32, ptr addrspace(1), i32, i32, i32, <2 x i32>)
80+
declare spir_func void @_Z33__spirv_Subgroup2DBlockStoreINTELiiiiPKvPU3AS1viiiDv2_i(i32, i32, i32, i32, ptr, ptr addrspace(1), i32, i32, i32, <2 x i32>)
81+
82+
!opencl.spir.version = !{!0}
83+
!spirv.Source = !{!1}
84+
!llvm.ident = !{!2}
85+
86+
!0 = !{i32 1, i32 0}
87+
!1 = !{i32 4, i32 100000}
88+
!2 = !{!"clang version 17.0.0"}

0 commit comments

Comments
 (0)