Skip to content

Commit 2cf71fc

Browse files
EbinJose2002michalpaszkowskiMrSidims
authored
[SPIRV] Added opencl Pipe builtins (#135335)
- Added opencl Pipe builtins - Pipe instructions were added in tablegen and lowered in SPIRVBuiltins.cpp --------- Co-authored-by: Michal Paszkowski <[email protected]> Co-authored-by: Dmitry Sidorov <[email protected]>
1 parent 0dbc1e2 commit 2cf71fc

File tree

4 files changed

+247
-1
lines changed

4 files changed

+247
-1
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,41 @@ static bool build2DBlockIOINTELInst(const SPIRV::IncomingCall *Call,
10961096
return true;
10971097
}
10981098

1099+
static bool buildPipeInst(const SPIRV::IncomingCall *Call, unsigned Opcode,
1100+
unsigned Scope, MachineIRBuilder &MIRBuilder,
1101+
SPIRVGlobalRegistry *GR) {
1102+
switch (Opcode) {
1103+
case SPIRV::OpCommitReadPipe:
1104+
case SPIRV::OpCommitWritePipe:
1105+
return buildOpFromWrapper(MIRBuilder, Opcode, Call, Register(0));
1106+
case SPIRV::OpGroupCommitReadPipe:
1107+
case SPIRV::OpGroupCommitWritePipe:
1108+
case SPIRV::OpGroupReserveReadPipePackets:
1109+
case SPIRV::OpGroupReserveWritePipePackets: {
1110+
Register ScopeConstReg =
1111+
MIRBuilder.buildConstant(LLT::scalar(32), Scope).getReg(0);
1112+
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
1113+
MRI->setRegClass(ScopeConstReg, &SPIRV::iIDRegClass);
1114+
MachineInstrBuilder MIB;
1115+
MIB = MIRBuilder.buildInstr(Opcode);
1116+
// Add Return register and type.
1117+
if (Opcode == SPIRV::OpGroupReserveReadPipePackets ||
1118+
Opcode == SPIRV::OpGroupReserveWritePipePackets)
1119+
MIB.addDef(Call->ReturnRegister)
1120+
.addUse(GR->getSPIRVTypeID(Call->ReturnType));
1121+
1122+
MIB.addUse(ScopeConstReg);
1123+
for (unsigned int i = 0; i < Call->Arguments.size(); ++i)
1124+
MIB.addUse(Call->Arguments[i]);
1125+
1126+
return true;
1127+
}
1128+
default:
1129+
return buildOpFromWrapper(MIRBuilder, Opcode, Call,
1130+
GR->getSPIRVTypeID(Call->ReturnType));
1131+
}
1132+
}
1133+
10991134
static unsigned getNumComponentsForDim(SPIRV::Dim::Dim dim) {
11001135
switch (dim) {
11011136
case SPIRV::Dim::DIM_1D:
@@ -2350,6 +2385,20 @@ static bool generate2DBlockIOINTELInst(const SPIRV::IncomingCall *Call,
23502385
return build2DBlockIOINTELInst(Call, Opcode, MIRBuilder, GR);
23512386
}
23522387

2388+
static bool generatePipeInst(const SPIRV::IncomingCall *Call,
2389+
MachineIRBuilder &MIRBuilder,
2390+
SPIRVGlobalRegistry *GR) {
2391+
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
2392+
unsigned Opcode =
2393+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
2394+
2395+
unsigned Scope = SPIRV::Scope::Workgroup;
2396+
if (Builtin->Name.contains("sub_group"))
2397+
Scope = SPIRV::Scope::Subgroup;
2398+
2399+
return buildPipeInst(Call, Opcode, Scope, MIRBuilder, GR);
2400+
}
2401+
23532402
static bool buildNDRange(const SPIRV::IncomingCall *Call,
23542403
MachineIRBuilder &MIRBuilder,
23552404
SPIRVGlobalRegistry *GR) {
@@ -2948,6 +2997,8 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
29482997
return generateTernaryBitwiseFunctionINTELInst(Call.get(), MIRBuilder, GR);
29492998
case SPIRV::Block2DLoadStore:
29502999
return generate2DBlockIOINTELInst(Call.get(), MIRBuilder, GR);
3000+
case SPIRV::Pipe:
3001+
return generatePipeInst(Call.get(), MIRBuilder, GR);
29513002
}
29523003
return false;
29533004
}

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def ExtendedBitOps : BuiltinGroup;
6969
def BindlessINTEL : BuiltinGroup;
7070
def TernaryBitwiseINTEL : BuiltinGroup;
7171
def Block2DLoadStore : BuiltinGroup;
72+
def Pipe : BuiltinGroup;
7273

7374
//===----------------------------------------------------------------------===//
7475
// Class defining a demangled builtin record. The information in the record
@@ -633,6 +634,29 @@ defm : DemangledNativeBuiltin<"__spirv_AtomicSMax", OpenCL_std, Atomic, 4, 4, Op
633634
defm : DemangledNativeBuiltin<"__spirv_AtomicUMin", OpenCL_std, Atomic, 4, 4, OpAtomicUMin>;
634635
defm : DemangledNativeBuiltin<"__spirv_AtomicUMax", OpenCL_std, Atomic, 4, 4, OpAtomicUMax>;
635636

637+
// Pipe Instruction
638+
defm : DemangledNativeBuiltin<"__read_pipe_2", OpenCL_std, Pipe,2, 2, OpReadPipe>;
639+
defm : DemangledNativeBuiltin<"__write_pipe_2", OpenCL_std, Pipe, 2, 2, OpWritePipe>;
640+
defm : DemangledNativeBuiltin<"__read_pipe_4", OpenCL_std, Pipe,4, 4, OpReservedReadPipe>;
641+
defm : DemangledNativeBuiltin<"__write_pipe_4", OpenCL_std, Pipe, 4, 4, OpReservedWritePipe>;
642+
defm : DemangledNativeBuiltin<"__reserve_read_pipe", OpenCL_std, Pipe, 2, 2, OpReserveReadPipePackets>;
643+
defm : DemangledNativeBuiltin<"__reserve_write_pipe", OpenCL_std, Pipe, 2, 2, OpReserveWritePipePackets>;
644+
defm : DemangledNativeBuiltin<"__commit_read_pipe", OpenCL_std, Pipe, 2, 2, OpCommitReadPipe>;
645+
defm : DemangledNativeBuiltin<"__commit_write_pipe", OpenCL_std, Pipe, 2, 2, OpCommitWritePipe>;
646+
defm : DemangledNativeBuiltin<"is_valid_reserve_id", OpenCL_std, Pipe, 1, 1, OpIsValidReserveId>;
647+
defm : DemangledNativeBuiltin<"__get_pipe_num_packets_ro", OpenCL_std, Pipe, 1, 1, OpGetNumPipePackets>;
648+
defm : DemangledNativeBuiltin<"__get_pipe_max_packets_ro", OpenCL_std, Pipe, 1, 1, OpGetMaxPipePackets>;
649+
defm : DemangledNativeBuiltin<"__get_pipe_num_packets_wo", OpenCL_std, Pipe, 1, 1, OpGetNumPipePackets>;
650+
defm : DemangledNativeBuiltin<"__get_pipe_max_packets_wo", OpenCL_std, Pipe, 1, 1, OpGetMaxPipePackets>;
651+
defm : DemangledNativeBuiltin<"__work_group_reserve_read_pipe", OpenCL_std, Pipe, 2, 2, OpGroupReserveReadPipePackets>;
652+
defm : DemangledNativeBuiltin<"__work_group_reserve_write_pipe", OpenCL_std, Pipe, 2, 2, OpGroupReserveWritePipePackets>;
653+
defm : DemangledNativeBuiltin<"__work_group_commit_read_pipe", OpenCL_std, Pipe, 2, 2, OpGroupCommitReadPipe>;
654+
defm : DemangledNativeBuiltin<"__work_group_commit_write_pipe", OpenCL_std, Pipe, 2, 2, OpGroupCommitWritePipe>;
655+
defm : DemangledNativeBuiltin<"__sub_group_reserve_read_pipe", OpenCL_std, Pipe, 2, 2, OpGroupReserveReadPipePackets>;
656+
defm : DemangledNativeBuiltin<"__sub_group_reserve_write_pipe", OpenCL_std, Pipe, 2, 2, OpGroupReserveWritePipePackets>;
657+
defm : DemangledNativeBuiltin<"__sub_group_commit_read_pipe", OpenCL_std, Pipe, 2, 2, OpGroupCommitReadPipe>;
658+
defm : DemangledNativeBuiltin<"__sub_group_commit_write_pipe", OpenCL_std, Pipe, 2, 2, OpGroupCommitWritePipe>;
659+
636660
// Barrier builtin records:
637661
defm : DemangledNativeBuiltin<"barrier", OpenCL_std, Barrier, 1, 3, OpControlBarrier>;
638662
defm : DemangledNativeBuiltin<"work_group_barrier", OpenCL_std, Barrier, 1, 3, OpControlBarrier>;

llvm/lib/Target/SPIRV/SPIRVInstrInfo.td

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,38 @@ def OpGetDefaultQueue: Op<303, (outs ID:$res), (ins TYPE:$type),
763763
def OpBuildNDRange: Op<304, (outs ID:$res), (ins TYPE:$type, ID:$GWS, ID:$LWS, ID:$GWO),
764764
"$res = OpBuildNDRange $type $GWS $LWS $GWO">;
765765

766-
// TODO: 3.42.23. Pipe Instructions
766+
// 3.42.23. Pipe Instructions
767+
768+
def OpReadPipe: Op<274, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$Pointer, ID:$PcktSize, ID:$PcktAlign),
769+
"$res = OpReadPipe $type $Pipe $Pointer $PcktSize $PcktAlign">;
770+
def OpWritePipe: Op<275, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$Pointer, ID:$PcktSize, ID:$PcktAlign),
771+
"$res = OpWritePipe $type $Pipe $Pointer $PcktSize $PcktAlign">;
772+
def OpReservedReadPipe : Op<276, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$ReserveId, ID:$Index, ID:$Pointer, ID:$PcktSize, ID:$PcktAlign),
773+
"$res = OpReservedReadPipe $type $Pipe $ReserveId $Index $Pointer $PcktSize $PcktAlign">;
774+
def OpReservedWritePipe : Op<277, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$ReserveId, ID:$Index, ID:$Pointer, ID:$PcktSize, ID:$PcktAlign),
775+
"$res = OpReservedWritePipe $type $Pipe $ReserveId $Index $Pointer $PcktSize $PcktAlign">;
776+
def OpReserveReadPipePackets : Op<278, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$NumPckts, ID:$PcktSize, ID:$PcktAlign),
777+
"$res = OpReserveReadPipePackets $type $Pipe $NumPckts $PcktSize $PcktAlign">;
778+
def OpReserveWritePipePackets : Op<279, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$NumPckts, ID:$PcktSize, ID:$PcktAlign),
779+
"$res = OpReserveWritePipePackets $type $Pipe $NumPckts $PcktSize $PcktAlign">;
780+
def OpCommitReadPipe : Op<280, (outs), (ins ID:$Pipe, ID:$ReserveId, ID:$PcktSize, ID:$PcktAlign),
781+
"OpCommitReadPipe $Pipe $ReserveId $PcktSize $PcktAlign">;
782+
def OpCommitWritePipe : Op<281, (outs), (ins ID:$Pipe, ID:$ReserveId, ID:$PcktSize, ID:$PcktAlign),
783+
"OpCommitWritePipe $Pipe $ReserveId $PcktSize $PcktAlign">;
784+
def OpIsValidReserveId : Op<282, (outs ID:$res), (ins TYPE:$type, ID:$ReserveId),
785+
"$res = OpIsValidReserveId $type $ReserveId">;
786+
def OpGetNumPipePackets : Op<283, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$PacketSize, ID:$PacketAlign),
787+
"$res = OpGetNumPipePackets $type $Pipe $PacketSize $PacketAlign">;
788+
def OpGetMaxPipePackets : Op<284, (outs ID:$res), (ins TYPE:$type, ID:$Pipe, ID:$PacketSize, ID:$PacketAlign),
789+
"$res = OpGetMaxPipePackets $type $Pipe $PacketSize $PacketAlign">;
790+
def OpGroupReserveReadPipePackets : Op<285, (outs ID:$res), (ins TYPE:$type, ID:$Scope, ID:$Pipe, ID:$NumPckts, ID:$PacketSize, ID:$PacketAlign),
791+
"$res = OpGroupReserveReadPipePackets $type $Scope $Pipe $NumPckts $PacketSize $PacketAlign">;
792+
def OpGroupReserveWritePipePackets : Op<286, (outs ID:$res), (ins TYPE:$type, ID:$Scope, ID:$Pipe, ID:$NumPckts, ID:$PacketSize, ID:$PacketAlign),
793+
"$res = OpGroupReserveWritePipePackets $type $Scope $Pipe $NumPckts $PacketSize $PacketAlign">;
794+
def OpGroupCommitReadPipe : Op<287, (outs), (ins ID:$Scope, ID:$Pipe, ID:$ReserveId, ID:$PacketSize, ID:$PacketAlign),
795+
"OpGroupCommitReadPipe $Scope $Pipe $ReserveId $PacketSize $PacketAlign">;
796+
def OpGroupCommitWritePipe : Op<288, (outs), (ins ID:$Scope, ID:$Pipe, ID:$ReserveId, ID:$PacketSize, ID:$PacketAlign),
797+
"OpGroupCommitWritePipe $Scope $Pipe $ReserveId $PacketSize $PacketAlign">;
767798

768799
// 3.42.24. Non-Uniform Instructions
769800

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK: OpCapability Kernel
5+
; CHECK: OpCapability Addresses
6+
; CHECK: OpCapability Pipes
7+
; CHECK: OpCapability Int8
8+
; CHECK: OpCapability GenericPointer
9+
10+
; CHECK-DAG: %[[#PipeWriteTy:]] = OpTypePipe WriteOnly
11+
; CHECK-DAG: %[[#PipeReadTy:]] = OpTypePipe ReadOnly
12+
; CHECK-DAG: %[[#ReserveIdTy:]] = OpTypeReserveId
13+
; CHECK-DAG: %[[#BoolTy:]] = OpTypeBool
14+
; CHECK-DAG: %[[#Int32Ty:]] = OpTypeInt 32 0
15+
; CHECK-DAG: %[[#Uint1:]] = OpConstant %[[#Int32Ty]] 1
16+
; CHECK-DAG: %[[#Uint2:]] = OpConstant %[[#Int32Ty]] 2
17+
; CHECK-DAG: %[[#Uint3:]] = OpConstant %[[#Int32Ty]] 3
18+
; CHECK-DAG: %[[#Uint4:]] = OpConstant %[[#Int32Ty]] 4
19+
; CHECK-DAG: %[[#NullUint:]] = OpConstantNull %[[#Int32Ty]]
20+
21+
; CHECK: OpFunction
22+
; CHECK: %[[#FuncParam1:]] = OpFunctionParameter %[[#PipeWriteTy]]
23+
; CHECK: %[[#FuncParam2:]] = OpFunctionParameter %[[#PipeReadTy]]
24+
25+
; CHECK: %[[#BasicWriteReserve:]] = OpReserveWritePipePackets %[[#ReserveIdTy]] %[[#FuncParam1]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
26+
; CHECK: OpWritePipe %[[#Int32Ty]] %[[#FuncParam1]] %[[#]] %[[#Uint4]] %[[#Uint4]]
27+
; CHECK: OpCommitWritePipe %[[#FuncParam1]] %[[#BasicWriteReserve]] %[[#Uint4]] %[[#Uint4]]
28+
; CHECK: %[[#BasicReadReserve:]] = OpReserveReadPipePackets %[[#ReserveIdTy]] %[[#FuncParam2]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
29+
; CHECK: OpReadPipe %[[#Int32Ty]] %[[#FuncParam2]] %[[#]] %[[#Uint4]] %[[#Uint4]]
30+
; CHECK: OpCommitReadPipe %[[#FuncParam2]] %[[#BasicReadReserve]] %[[#Uint4]] %[[#Uint4]]
31+
32+
; --- Reserved pipe operations ---
33+
; CHECK: %[[#ReservedWriteReserve:]] = OpReserveWritePipePackets %[[#ReserveIdTy]] %[[#FuncParam1]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
34+
; CHECK: %[[#ReservedWrite:]] = OpReservedWritePipe %[[#Int32Ty]] %[[#FuncParam1]] %[[#ReservedWriteReserve]] %[[#NullUint]] %[[#]] %[[#Uint4]] %[[#Uint4]]
35+
; CHECK: %[[#IsValidWrite:]] = OpIsValidReserveId %[[#BoolTy]] %[[#ReservedWriteReserve]]
36+
; CHECK: OpCommitWritePipe %[[#FuncParam1]] %[[#ReservedWriteReserve]] %[[#Uint4]] %[[#Uint4]]
37+
; CHECK: %[[#ReservedReadReserve:]] = OpReserveReadPipePackets %[[#ReserveIdTy]] %[[#FuncParam2]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
38+
; CHECK: %[[#ReservedRead:]] = OpReservedReadPipe %[[#Int32Ty]] %[[#FuncParam2]] %[[#ReservedReadReserve]] %[[#NullUint]] %[[#]] %[[#Uint4]] %[[#Uint4]]
39+
; CHECK: %[[#IsValidRead:]] = OpIsValidReserveId %[[#BoolTy]] %[[#ReservedReadReserve]]
40+
; CHECK: OpCommitReadPipe %[[#FuncParam2]] %[[#ReservedReadReserve]] %[[#Uint4]] %[[#Uint4]]
41+
42+
; --- Pipe packet queries ---
43+
; CHECK: %[[#MaxPacketsWO:]] = OpGetMaxPipePackets %[[#Int32Ty]] %[[#FuncParam1]] %[[#Uint4]] %[[#Uint4]]
44+
; CHECK: OpStore %[[#]] %[[#MaxPacketsWO]] Aligned 4
45+
; CHECK: %[[#NumPacketsWO:]] = OpGetNumPipePackets %[[#Int32Ty]] %[[#FuncParam1]] %[[#Uint4]] %[[#Uint4]]
46+
; CHECK: OpStore %[[#]] %[[#NumPacketsWO]] Aligned 4
47+
; CHECK: %[[#MaxPacketsRO:]] = OpGetMaxPipePackets %[[#Int32Ty]] %[[#FuncParam2]] %[[#Uint4]] %[[#Uint4]]
48+
; CHECK: OpStore %[[#]] %[[#MaxPacketsRO]] Aligned 4
49+
; CHECK: %[[#NumPacketsRO:]] = OpGetNumPipePackets %[[#Int32Ty]] %[[#FuncParam2]] %[[#Uint4]] %[[#Uint4]]
50+
; CHECK: OpStore %[[#]] %[[#NumPacketsRO]] Aligned 4
51+
52+
; --- Workgroup operations ---
53+
; CHECK: %[[#WorkgroupWriteReserve:]] = OpGroupReserveWritePipePackets %[[#ReserveIdTy]] %[[#Uint2]] %[[#FuncParam1]] %[[#Uint1]] %[[#Uint1]] %[[#Uint1]]
54+
; CHECK: OpGroupCommitWritePipe %[[#Uint2]] %[[#FuncParam1]] %[[#WorkgroupWriteReserve]] %[[#Uint1]] %[[#Uint1]]
55+
; CHECK: %[[#WorkgroupReadReserve:]] = OpGroupReserveReadPipePackets %[[#ReserveIdTy]] %[[#Uint2]] %[[#FuncParam2]] %[[#Uint1]] %[[#Uint1]] %[[#Uint1]]
56+
; CHECK: OpGroupCommitReadPipe %[[#Uint2]] %[[#FuncParam2]] %[[#WorkgroupReadReserve]] %[[#Uint1]] %[[#Uint1]]
57+
58+
; --- Subgroup operations ---
59+
; CHECK: %[[#SubgroupWriteReserve:]] = OpGroupReserveWritePipePackets %[[#ReserveIdTy]] %[[#Uint3]] %[[#FuncParam1]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
60+
; CHECK: OpGroupCommitWritePipe %[[#Uint3]] %[[#FuncParam1]] %[[#SubgroupWriteReserve]] %[[#Uint4]] %[[#Uint4]]
61+
; CHECK: %[[#SubgroupReadReserve:]] = OpGroupReserveReadPipePackets %[[#ReserveIdTy]] %[[#Uint3]] %[[#FuncParam2]] %[[#Uint1]] %[[#Uint4]] %[[#Uint4]]
62+
; CHECK: OpGroupCommitReadPipe %[[#Uint3]] %[[#FuncParam2]] %[[#SubgroupReadReserve]] %[[#Uint4]] %[[#Uint4]]
63+
64+
define spir_kernel void @test_pipe_builtins(
65+
target("spirv.Pipe", 1) %out_pipe,
66+
target("spirv.Pipe", 0) %in_pipe,
67+
ptr addrspace(4) %src,
68+
ptr addrspace(4) %dst,
69+
ptr addrspace(1) %max_packets_wo,
70+
ptr addrspace(1) %num_packets_wo,
71+
ptr addrspace(1) %max_packets_ro,
72+
ptr addrspace(1) %num_packets_ro
73+
) {
74+
entry:
75+
; Basic pipe operations
76+
%0 = call spir_func target("spirv.ReserveId") @__reserve_write_pipe(target("spirv.Pipe", 1) %out_pipe, i32 1, i32 4, i32 4)
77+
%1 = call spir_func i32 @__write_pipe_2(target("spirv.Pipe", 1) %out_pipe, ptr addrspace(4) %src, i32 4, i32 4)
78+
call spir_func void @__commit_write_pipe(target("spirv.Pipe", 1) %out_pipe, target("spirv.ReserveId") %0, i32 4, i32 4)
79+
80+
%2 = call spir_func target("spirv.ReserveId") @__reserve_read_pipe(target("spirv.Pipe", 0) %in_pipe, i32 1, i32 4, i32 4)
81+
%3 = call spir_func i32 @__read_pipe_2(target("spirv.Pipe", 0) %in_pipe, ptr addrspace(4) %dst, i32 4, i32 4)
82+
call spir_func void @__commit_read_pipe(target("spirv.Pipe", 0) %in_pipe, target("spirv.ReserveId") %2, i32 4, i32 4)
83+
84+
; Reserved pipe operations
85+
%4 = call spir_func target("spirv.ReserveId") @__reserve_write_pipe(target("spirv.Pipe", 1) %out_pipe, i32 1, i32 4, i32 4)
86+
%5 = call spir_func i32 @__write_pipe_4(target("spirv.Pipe", 1) %out_pipe, target("spirv.ReserveId") %4, i32 0, ptr addrspace(4) %src, i32 4, i32 4)
87+
%6 = call spir_func i1 @_Z19is_valid_reserve_id13ocl_reserveid(target("spirv.ReserveId") %4)
88+
call spir_func void @__commit_write_pipe(target("spirv.Pipe", 1) %out_pipe, target("spirv.ReserveId") %4, i32 4, i32 4)
89+
90+
%7 = call spir_func target("spirv.ReserveId") @__reserve_read_pipe(target("spirv.Pipe", 0) %in_pipe, i32 1, i32 4, i32 4)
91+
%8 = call spir_func i32 @__read_pipe_4(target("spirv.Pipe", 0) %in_pipe, target("spirv.ReserveId") %7, i32 0, ptr addrspace(4) %dst, i32 4, i32 4)
92+
%9 = call spir_func i1 @_Z19is_valid_reserve_id13ocl_reserveid(target("spirv.ReserveId") %7)
93+
call spir_func void @__commit_read_pipe(target("spirv.Pipe", 0) %in_pipe, target("spirv.ReserveId") %7, i32 4, i32 4)
94+
95+
; Pipe packet queries
96+
%10 = call spir_func i32 @__get_pipe_max_packets_wo(target("spirv.Pipe", 1) %out_pipe, i32 4, i32 4)
97+
store i32 %10, ptr addrspace(1) %max_packets_wo, align 4
98+
%11 = call spir_func i32 @__get_pipe_num_packets_wo(target("spirv.Pipe", 1) %out_pipe, i32 4, i32 4)
99+
store i32 %11, ptr addrspace(1) %num_packets_wo, align 4
100+
%12 = call spir_func i32 @__get_pipe_max_packets_ro(target("spirv.Pipe", 0) %in_pipe, i32 4, i32 4)
101+
store i32 %12, ptr addrspace(1) %max_packets_ro, align 4
102+
%13 = call spir_func i32 @__get_pipe_num_packets_ro(target("spirv.Pipe", 0) %in_pipe, i32 4, i32 4)
103+
store i32 %13, ptr addrspace(1) %num_packets_ro, align 4
104+
105+
; Workgroup operations
106+
%14 = call spir_func target("spirv.ReserveId") @__work_group_reserve_write_pipe(target("spirv.Pipe", 1) %out_pipe, i32 1, i32 1, i32 1)
107+
call spir_func void @__work_group_commit_write_pipe(target("spirv.Pipe", 1) %out_pipe, target("spirv.ReserveId") %14, i32 1, i32 1)
108+
%15 = call spir_func target("spirv.ReserveId") @__work_group_reserve_read_pipe(target("spirv.Pipe", 0) %in_pipe, i32 1, i32 1, i32 1)
109+
call spir_func void @__work_group_commit_read_pipe(target("spirv.Pipe", 0) %in_pipe, target("spirv.ReserveId") %15, i32 1, i32 1)
110+
111+
; Subgroup operations
112+
%16 = call spir_func target("spirv.ReserveId") @__sub_group_reserve_write_pipe(target("spirv.Pipe", 1) %out_pipe, i32 1, i32 4, i32 4)
113+
call spir_func void @__sub_group_commit_write_pipe(target("spirv.Pipe", 1) %out_pipe, target("spirv.ReserveId") %16, i32 4, i32 4)
114+
%17 = call spir_func target("spirv.ReserveId") @__sub_group_reserve_read_pipe(target("spirv.Pipe", 0) %in_pipe, i32 1, i32 4, i32 4)
115+
call spir_func void @__sub_group_commit_read_pipe(target("spirv.Pipe", 0) %in_pipe, target("spirv.ReserveId") %17, i32 4, i32 4)
116+
117+
ret void
118+
}
119+
120+
declare spir_func target("spirv.ReserveId") @__reserve_write_pipe(target("spirv.Pipe", 1), i32, i32, i32)
121+
declare spir_func target("spirv.ReserveId") @__reserve_read_pipe(target("spirv.Pipe", 0), i32, i32, i32)
122+
declare spir_func i32 @__write_pipe_2(target("spirv.Pipe", 1), ptr addrspace(4), i32, i32)
123+
declare spir_func i32 @__read_pipe_2(target("spirv.Pipe", 0), ptr addrspace(4), i32, i32)
124+
declare spir_func i32 @__write_pipe_4(target("spirv.Pipe", 1), target("spirv.ReserveId"), i32, ptr addrspace(4), i32, i32)
125+
declare spir_func i32 @__read_pipe_4(target("spirv.Pipe", 0), target("spirv.ReserveId"), i32, ptr addrspace(4), i32, i32)
126+
declare spir_func void @__commit_write_pipe(target("spirv.Pipe", 1), target("spirv.ReserveId"), i32, i32)
127+
declare spir_func void @__commit_read_pipe(target("spirv.Pipe", 0), target("spirv.ReserveId"), i32, i32)
128+
declare spir_func i1 @_Z19is_valid_reserve_id13ocl_reserveid(target("spirv.ReserveId"))
129+
declare spir_func i32 @__get_pipe_max_packets_wo(target("spirv.Pipe", 1), i32, i32)
130+
declare spir_func i32 @__get_pipe_num_packets_wo(target("spirv.Pipe", 1), i32, i32)
131+
declare spir_func i32 @__get_pipe_max_packets_ro(target("spirv.Pipe", 0), i32, i32)
132+
declare spir_func i32 @__get_pipe_num_packets_ro(target("spirv.Pipe", 0), i32, i32)
133+
declare spir_func target("spirv.ReserveId") @__work_group_reserve_write_pipe(target("spirv.Pipe", 1), i32, i32, i32)
134+
declare spir_func void @__work_group_commit_write_pipe(target("spirv.Pipe", 1), target("spirv.ReserveId"), i32, i32)
135+
declare spir_func target("spirv.ReserveId") @__work_group_reserve_read_pipe(target("spirv.Pipe", 0), i32, i32, i32)
136+
declare spir_func void @__work_group_commit_read_pipe(target("spirv.Pipe", 0), target("spirv.ReserveId"), i32, i32)
137+
declare spir_func target("spirv.ReserveId") @__sub_group_reserve_write_pipe(target("spirv.Pipe", 1), i32, i32, i32)
138+
declare spir_func void @__sub_group_commit_write_pipe(target("spirv.Pipe", 1), target("spirv.ReserveId"), i32, i32)
139+
declare spir_func target("spirv.ReserveId") @__sub_group_reserve_read_pipe(target("spirv.Pipe", 0), i32, i32, i32)
140+
declare spir_func void @__sub_group_commit_read_pipe(target("spirv.Pipe", 0), target("spirv.ReserveId"), i32, i32)

0 commit comments

Comments
 (0)