Skip to content

Commit ed629d3

Browse files
svenvhjsji
authored andcommitted
SPIRVReader: Add OpSizeOf support (#2853)
The `OpSizeOf` instruction was added in SPIR-V 1.1, but not supported yet. Original commit: KhronosGroup/SPIRV-LLVM-Translator@9aeb7eb92d7c0cb
1 parent ea9c0c5 commit ed629d3

File tree

5 files changed

+53
-1
lines changed

5 files changed

+53
-1
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,6 +1567,15 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
15671567
case OpUndef:
15681568
return mapValue(BV, UndefValue::get(transType(BV->getType())));
15691569

1570+
case OpSizeOf: {
1571+
Type *ResTy = transType(BV->getType());
1572+
auto *BI = static_cast<SPIRVSizeOf *>(BV);
1573+
SPIRVType *TypeArg = reinterpret_cast<SPIRVType *>(BI->getOpValue(0));
1574+
Type *EltTy = transType(TypeArg->getPointerElementType());
1575+
uint64_t Size = M->getDataLayout().getTypeStoreSize(EltTy).getFixedValue();
1576+
return mapValue(BV, ConstantInt::get(ResTy, Size));
1577+
}
1578+
15701579
case OpVariable:
15711580
case OpUntypedVariableKHR: {
15721581
auto *BVar = static_cast<SPIRVVariableBase *>(BV);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,6 @@ _SPIRV_OP(NamedBarrierInitialize)
10891089
_SPIRV_OP(MemoryNamedBarrier)
10901090
_SPIRV_OP(GetKernelMaxNumSubgroups)
10911091
_SPIRV_OP(GetKernelLocalSizeForSubgroupCount)
1092-
_SPIRV_OP(SizeOf)
10931092
#undef _SPIRV_OP
10941093

10951094
} // namespace SPIRV

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,6 +1622,16 @@ class SPIRVTranspose : public SPIRVInstruction {
16221622
SPIRVId Matrix;
16231623
};
16241624

1625+
class SPIRVSizeOfInstBase : public SPIRVInstTemplateBase {
1626+
protected:
1627+
VersionNumber getRequiredSPIRVVersion() const override {
1628+
return VersionNumber::SPIRV_1_1;
1629+
}
1630+
};
1631+
1632+
typedef SPIRVInstTemplate<SPIRVSizeOfInstBase, OpSizeOf, true, 4, false>
1633+
SPIRVSizeOf;
1634+
16251635
class SPIRVUnary : public SPIRVInstTemplateBase {
16261636
protected:
16271637
void validate() const override {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ _SPIRV_OP(ImageSparseTexelsResident, 316)
291291
_SPIRV_OP(NoLine, 317)
292292
_SPIRV_OP(AtomicFlagTestAndSet, 318)
293293
_SPIRV_OP(AtomicFlagClear, 319)
294+
_SPIRV_OP(SizeOf, 321)
294295
_SPIRV_OP(TypePipeStorage, 322)
295296
_SPIRV_OP(ConstantPipeStorage, 323)
296297
_SPIRV_OP(CreatePipeFromPipeStorage, 324)

llvm-spirv/test/OpSizeOf.spvasm

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
; REQUIRES: spirv-as
2+
; RUN: spirv-as --target-env spv1.1 -o %t.spv %s
3+
; TODO: reenable spirv-val when OpSizeOf is supported.
4+
; R/U/N: spirv-val %t.spv
5+
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s
6+
OpCapability Addresses
7+
OpCapability Kernel
8+
OpMemoryModel Physical64 OpenCL
9+
OpEntryPoint Kernel %f "testSizeOf"
10+
OpName %p "p"
11+
%void = OpTypeVoid
12+
%bool = OpTypeBool
13+
%i32 = OpTypeInt 32 0
14+
%struct = OpTypeStruct %i32 %i32
15+
%_ptr_CrossWorkgroup_bool = OpTypePointer CrossWorkgroup %bool
16+
%_ptr_CrossWorkgroup_i32 = OpTypePointer CrossWorkgroup %i32
17+
%_ptr_CrossWorkgroup_struct = OpTypePointer CrossWorkgroup %struct
18+
%fnTy = OpTypeFunction %void %_ptr_CrossWorkgroup_i32
19+
20+
%f = OpFunction %void None %fnTy
21+
%p = OpFunctionParameter %_ptr_CrossWorkgroup_i32
22+
%10 = OpLabel
23+
24+
; CHECK: store i32 1, ptr addrspace(1) %p
25+
%11 = OpSizeOf %i32 %_ptr_CrossWorkgroup_bool
26+
OpStore %p %11
27+
28+
; CHECK: store i32 8, ptr addrspace(1) %p
29+
%12 = OpSizeOf %i32 %_ptr_CrossWorkgroup_struct
30+
OpStore %p %12
31+
32+
OpReturn
33+
OpFunctionEnd

0 commit comments

Comments
 (0)