Skip to content

Commit e8f1964

Browse files
authored
Fix SPIR-V Friendly IR generation for OpTypePipe (#1329)
1 parent a4d0a53 commit e8f1964

File tree

6 files changed

+45
-41
lines changed

6 files changed

+45
-41
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -332,21 +332,15 @@ SPIRVToLLVM::transVMEImageTypeName(SPIRV::SPIRVTypeVmeImageINTEL *VT) {
332332
: AccessQualifierReadOnly));
333333
}
334334

335-
std::string
336-
SPIRVToLLVM::transOCLPipeTypeName(SPIRV::SPIRVTypePipe *PT,
337-
bool UseSPIRVFriendlyFormat,
338-
SPIRVAccessQualifierKind PipeAccess) {
335+
std::string SPIRVToLLVM::transPipeTypeName(SPIRV::SPIRVTypePipe *PT) {
336+
SPIRVAccessQualifierKind PipeAccess = PT->getAccessQualifier();
337+
339338
assert((PipeAccess == AccessQualifierReadOnly ||
340339
PipeAccess == AccessQualifierWriteOnly) &&
341340
"Invalid access qualifier");
342341

343-
if (!UseSPIRVFriendlyFormat)
344-
return PipeAccess == AccessQualifierWriteOnly ? kSPR2TypeName::PipeWO
345-
: kSPR2TypeName::PipeRO;
346-
else
347-
return std::string(kSPIRVTypeName::PrefixAndDelim) + kSPIRVTypeName::Pipe +
348-
kSPIRVTypeName::Delimiter + kSPIRVTypeName::PostfixDelim +
349-
PipeAccess;
342+
return std::string(kSPIRVTypeName::PrefixAndDelim) + kSPIRVTypeName::Pipe +
343+
kSPIRVTypeName::Delimiter + kSPIRVTypeName::PostfixDelim + PipeAccess;
350344
}
351345

352346
std::string
@@ -444,11 +438,9 @@ Type *SPIRVToLLVM::transType(SPIRVType *T, bool IsClassMember) {
444438
}
445439
case OpTypePipe: {
446440
auto PT = static_cast<SPIRVTypePipe *>(T);
447-
return mapType(T, getOrCreateOpaquePtrType(
448-
M,
449-
transOCLPipeTypeName(PT, IsClassMember,
450-
PT->getAccessQualifier()),
451-
getOCLOpaqueTypeAddrSpace(T->getOpCode())));
441+
return mapType(
442+
T, getOrCreateOpaquePtrType(M, transPipeTypeName(PT),
443+
getOCLOpaqueTypeAddrSpace(T->getOpCode())));
452444
}
453445
case OpTypePipeStorage: {
454446
auto PST = static_cast<SPIRVTypePipeStorage *>(T);

lib/SPIRV/SPIRVReader.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,7 @@ class SPIRVToLLVM {
211211
std::string transOCLImageTypeName(SPIRV::SPIRVTypeImage *ST);
212212
std::string transOCLSampledImageTypeName(SPIRV::SPIRVTypeSampledImage *ST);
213213
std::string transVMEImageTypeName(SPIRV::SPIRVTypeVmeImageINTEL *VT);
214-
std::string transOCLPipeTypeName(
215-
SPIRV::SPIRVTypePipe *ST, bool UseSPIRVFriendlyFormat = false,
216-
SPIRVAccessQualifierKind PipeAccess = AccessQualifierReadOnly);
214+
std::string transPipeTypeName(SPIRV::SPIRVTypePipe *ST);
217215
std::string transOCLPipeStorageTypeName(SPIRV::SPIRVTypePipeStorage *PST);
218216
std::string transOCLImageTypeAccessQualifier(SPIRV::SPIRVTypeImage *ST);
219217
std::string transOCLPipeTypeAccessQualifier(SPIRV::SPIRVTypePipe *ST);

lib/SPIRV/SPIRVToOCL.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,16 @@ SPIRVToOCLBase::getOCLImageOpaqueType(SmallVector<std::string, 8> &Postfixes) {
10891089
return OCLStructName;
10901090
}
10911091

1092+
std::string
1093+
SPIRVToOCLBase::getOCLPipeOpaqueType(SmallVector<std::string, 8> &Postfixes) {
1094+
assert(Postfixes.size() == 1);
1095+
unsigned PipeAccess = atoi(Postfixes[0].c_str());
1096+
assert((PipeAccess == AccessQualifierReadOnly ||
1097+
PipeAccess == AccessQualifierWriteOnly) &&
1098+
"Invalid access qualifier");
1099+
return PipeAccess ? kSPR2TypeName::PipeWO : kSPR2TypeName::PipeRO;
1100+
}
1101+
10921102
void SPIRVToOCLBase::translateOpaqueTypes() {
10931103
for (auto *S : M->getIdentifiedStructTypes()) {
10941104
StringRef STName = S->getStructName();
@@ -1108,6 +1118,8 @@ void SPIRVToOCLBase::translateOpaqueTypes() {
11081118
std::string OCLOpaqueName;
11091119
if (OP == OpTypeImage)
11101120
OCLOpaqueName = getOCLImageOpaqueType(Postfixes);
1121+
else if (OP == OpTypePipe)
1122+
OCLOpaqueName = getOCLPipeOpaqueType(Postfixes);
11111123
else if (isSubgroupAvcINTELTypeOpCode(OP))
11121124
OCLOpaqueName = OCLSubgroupINTELTypeOpCodeMap::rmap(OP);
11131125
else if (isOpaqueGenericTypeOpCode(OP))

lib/SPIRV/SPIRVToOCL.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ class SPIRVToOCLBase : public InstVisitor<SPIRVToOCLBase> {
240240
/// Transform SPV-IR image opaque type into OpenCL representation,
241241
/// example: spirv.Image._void_1_0_0_0_0_0_1 => opencl.image2d_wo_t
242242
std::string getOCLImageOpaqueType(SmallVector<std::string, 8> &Postfixes);
243+
/// Transform SPV-IR pipe opaque type into OpenCL representation,
244+
/// example: spirv.Pipe._0 => opencl.pipe_ro_t
245+
std::string getOCLPipeOpaqueType(SmallVector<std::string, 8> &Postfixes);
243246

244247
void translateOpaqueTypes();
245248

test/transcoding/CreatePipeFromPipeStorage.ll

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
; RUN: llvm-spirv %t.bc -spirv-text -o %t.txt
33
; RUN: FileCheck < %t.txt %s --check-prefix=CHECK-SPIRV
44
; RUN: llvm-spirv %t.bc -o %t.spv
5-
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
6-
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
5+
; RUN: llvm-spirv -r --spirv-target-env=SPV-IR %t.spv -o %t.rev.bc
6+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-SPV-IR
77

88

9-
; CHECK-LLVM: %"[[CL_PIPE_STORAGE_NAME:[^"]+]]" = type { %spirv.PipeStorage addrspace(1)* }
10-
; CHECK-LLVM: %"[[CL_READ_PIPE_NAME:[^"]+read>]]" = type { %spirv.Pipe._0 addrspace(1)* }
11-
; CHECK-LLVM: %spirv.Pipe._0 = type opaque
12-
; CHECK-LLVM: %"[[CL_WRITE_PIPE_NAME:[^"]+write>]]" = type { %spirv.Pipe._1 addrspace(1)* }
13-
; CHECK-LLVM: %spirv.Pipe._1 = type opaque
9+
; CHECK-SPV-IR: %"[[CL_PIPE_STORAGE_NAME:[^"]+]]" = type { %spirv.PipeStorage addrspace(1)* }
10+
; CHECK-SPV-IR: %"[[CL_READ_PIPE_NAME:[^"]+read>]]" = type { %spirv.Pipe._0 addrspace(1)* }
11+
; CHECK-SPV-IR: %spirv.Pipe._0 = type opaque
12+
; CHECK-SPV-IR: %"[[CL_WRITE_PIPE_NAME:[^"]+write>]]" = type { %spirv.Pipe._1 addrspace(1)* }
13+
; CHECK-SPV-IR: %spirv.Pipe._1 = type opaque
1414

1515

1616
; CHECK-SPIRV: Capability Pipes
@@ -52,8 +52,8 @@ target triple = "spir-unknown-unknown"
5252
; Function Attrs: nounwind
5353
define spir_kernel void @worker() {
5454
entry:
55-
; CHECK-LLVM: %myrpipe = alloca %"[[CL_READ_PIPE_NAME]]", align 4
56-
; CHECK-LLVM: %mywpipe = alloca %"[[CL_WRITE_PIPE_NAME]]", align 4
55+
; CHECK-SPV-IR: %myrpipe = alloca %"[[CL_READ_PIPE_NAME]]", align 4
56+
; CHECK-SPV-IR: %mywpipe = alloca %"[[CL_WRITE_PIPE_NAME]]", align 4
5757

5858
; CHECK-SPIRV: Variable [[READ_PIPE_WRAPPER_PTR]] [[READ_PIPE_WRAPPER_ID]] 7
5959
; CHECK-SPIRV: Variable [[WRITE_PIPE_WRAPPER_PTR]] [[WRITE_PIPE_WRAPPER_ID]] 7
@@ -62,8 +62,8 @@ entry:
6262
%mywpipe = alloca %"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>", align 4
6363

6464

65-
; CHECK-LLVM: %[[ID0:[0-9]+]] = addrspacecast %"[[CL_PIPE_STORAGE_NAME]]" addrspace(1)* @mygpipe to %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)*
66-
; CHECK-LLVM: %[[ID1:[0-9]+]] = getelementptr %"[[CL_PIPE_STORAGE_NAME]]", %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)* %[[ID0]], i32 0, i32 0
65+
; CHECK-SPV-IR: %[[ID0:[0-9]+]] = addrspacecast %"[[CL_PIPE_STORAGE_NAME]]" addrspace(1)* @mygpipe to %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)*
66+
; CHECK-SPV-IR: %[[ID1:[0-9]+]] = getelementptr %"[[CL_PIPE_STORAGE_NAME]]", %"[[CL_PIPE_STORAGE_NAME]]" addrspace(4)* %[[ID0]], i32 0, i32 0
6767

6868
; CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[SPIRV0:[0-9]+]] [[PIPE_STORAGE_ID]]
6969
; CHECK-SPIRV: PtrAccessChain {{[0-9]+}} [[SPIRV1:[0-9]+]] [[SPIRV0]] [[CONSTANT_ZERO_ID]] [[CONSTANT_ZERO_ID]]
@@ -72,10 +72,10 @@ entry:
7272
%1 = getelementptr %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>", %"class.cl::pipe_storage<int __attribute__((ext_vector_type(4))), 1>" addrspace(4)* %0, i32 0, i32 0
7373

7474

75-
; CHECK-LLVM: %[[PIPE_STORAGE_1:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
76-
; CHECK-LLVM: %[[WRITE_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._1 addrspace(1)* @_Z39__spirv_CreatePipeFromPipeStorage_writePU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_1]])
77-
; CHECK-LLVM: %[[WRITE_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_WRITE_PIPE_NAME]]"* %mywpipe to %"[[CL_WRITE_PIPE_NAME]]" addrspace(4)*
78-
; CHECK-LLVM: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"[[CL_WRITE_PIPE_NAME]]" addrspace(4)* nocapture %[[WRITE_PIPE_WRAPPER]], %spirv.Pipe._1 addrspace(1)* %[[WRITE_PIPE]])
75+
; CHECK-SPV-IR: %[[PIPE_STORAGE_1:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
76+
; CHECK-SPV-IR: %[[WRITE_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._1 addrspace(1)* @_Z39__spirv_CreatePipeFromPipeStorage_writePU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_1]])
77+
; CHECK-SPV-IR: %[[WRITE_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_WRITE_PIPE_NAME]]"* %mywpipe to %"[[CL_WRITE_PIPE_NAME]]" addrspace(4)*
78+
; CHECK-SPV-IR: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"[[CL_WRITE_PIPE_NAME]]" addrspace(4)* nocapture %[[WRITE_PIPE_WRAPPER]], %spirv.Pipe._1 addrspace(1)* %[[WRITE_PIPE]])
7979

8080
; CHECK-SPIRV: Load {{[0-9]+}} [[PIPE_STORAGE_ID0:[0-9]+]] [[SPIRV1]] 2 4
8181
; CHECK-SPIRV: CreatePipeFromPipeStorage [[WRITE_PIPE]] [[WRITE_PIPE_ID:[0-9]+]] [[PIPE_STORAGE_ID0]]
@@ -88,10 +88,10 @@ entry:
8888
call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE1EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE1EEE(%"class.cl::pipe<int __attribute__((ext_vector_type(4))), cl::pipe_access::write>" addrspace(4)* %4, %spirv.Pipe._1 addrspace(1)* %3)
8989

9090

91-
; CHECK-LLVM: %[[PIPE_STORAGE_2:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
92-
; CHECK-LLVM: %[[READ_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._0 addrspace(1)* @_Z38__spirv_CreatePipeFromPipeStorage_readPU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_2]])
93-
; CHECK-LLVM: %[[READ_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_READ_PIPE_NAME]]"* %myrpipe to %"[[CL_READ_PIPE_NAME]]" addrspace(4)*
94-
; CHECK-LLVM: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"[[CL_READ_PIPE_NAME]]" addrspace(4)* nocapture %[[READ_PIPE_WRAPPER]], %spirv.Pipe._0 addrspace(1)* %[[READ_PIPE]])
91+
; CHECK-SPV-IR: %[[PIPE_STORAGE_2:[0-9]+]] = load %spirv.PipeStorage addrspace(1)*, %spirv.PipeStorage addrspace(1)* addrspace(4)* %[[ID1]], align 4
92+
; CHECK-SPV-IR: %[[READ_PIPE:[0-9]+]] = call spir_func %spirv.Pipe._0 addrspace(1)* @_Z38__spirv_CreatePipeFromPipeStorage_readPU3AS119__spirv_PipeStorage(%spirv.PipeStorage addrspace(1)* %[[PIPE_STORAGE_2]])
93+
; CHECK-SPV-IR: %[[READ_PIPE_WRAPPER:[0-9]+]] = addrspacecast %"[[CL_READ_PIPE_NAME]]"* %myrpipe to %"[[CL_READ_PIPE_NAME]]" addrspace(4)*
94+
; CHECK-SPV-IR: call spir_func void @_ZNU3AS42cl4pipeIDv4_iLNS_11pipe_accessE0EEC1EPU3AS1NS_7__spirv10OpTypePipeILNS3_15AccessQualifierE0EEE(%"[[CL_READ_PIPE_NAME]]" addrspace(4)* nocapture %[[READ_PIPE_WRAPPER]], %spirv.Pipe._0 addrspace(1)* %[[READ_PIPE]])
9595

9696
; CHECK-SPIRV: Load {{[0-9]+}} [[PIPE_STORAGE_ID1:[0-9]+]] [[SPIRV1]] 2 4
9797
; CHECK-SPIRV: CreatePipeFromPipeStorage [[READ_PIPE]] [[READ_PIPE_ID:[0-9]+]] [[PIPE_STORAGE_ID1]]

test/transcoding/spirv-types.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,8 @@ target triple = "spir-unknown-unknown"
8181
%spirv.Sampler = type opaque ; sampler_t
8282
%spirv.SampledImage._float_1_1_0_0_0_0_0 = type opaque
8383

84-
; TODO: translate pipe types to SPIR-V friendly IR
85-
; CHECK-LLVM-SPIRV-DAG: %opencl.pipe_ro_t = type opaque
86-
; CHECK-LLVM-SPIRV-DAG: %opencl.pipe_wo_t = type opaque
84+
; CHECK-LLVM-SPIRV-DAG: %spirv.Pipe._0 = type opaque
85+
; CHECK-LLVM-SPIRV-DAG: %spirv.Pipe._1 = type opaque
8786

8887
; CHECK-LLVM-SPIRV-DAG: %spirv.Image._void_0_0_0_0_0_0_0 = type opaque
8988
; CHECK-LLVM-SPIRV-DAG: %spirv.Image._uint_1_0_0_0_0_0_0 = type opaque

0 commit comments

Comments
 (0)