Skip to content

Commit

Permalink
[Backport to 15] add reverse translation for OpDecorateString and OpM…
Browse files Browse the repository at this point in the history
…emberDecorateString (KhronosGroup#2677)

This PR adds "reverse translation" (from SPIR-V to LLVM IR) support for OpDecorateString and OpMemberDecorateString, see KhronosGroup#2460 and KhronosGroup#2670. These instructions are currently treated as synonyms for OpDecorate and OpMemberDecorate. We'll want to tidy this up at some point, but at least for now we won't crash if we see these instructions.

I'll still need to add proper support for decorating variables in the input storage class for KhronosGroup#2670, but I'll do that in a separate PR.

(cherry picked from commit f7057b4)
  • Loading branch information
bashbaug authored and svenvh committed Oct 22, 2024
1 parent db50326 commit 2dadcf0
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/SPIRV/libSPIRV/SPIRVDecorate.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ class SPIRVDecorate : public SPIRVDecorateGeneric {
}
};

class SPIRVDecorateString : public SPIRVDecorate {};

class SPIRVDecorateId : public SPIRVDecorateGeneric {
public:
static const Op OC = OpDecorateId;
Expand Down Expand Up @@ -352,6 +354,8 @@ class SPIRVMemberDecorate : public SPIRVDecorateGeneric {
SPIRVWord MemberNumber;
};

class SPIRVMemberDecorateString : public SPIRVMemberDecorate {};

class SPIRVDecorationGroup : public SPIRVEntry {
public:
static const Op OC = OpDecorationGroup;
Expand Down
2 changes: 2 additions & 0 deletions lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,8 @@ _SPIRV_OP(AtomicFMinEXT, 5614)
_SPIRV_OP(AtomicFMaxEXT, 5615)
_SPIRV_OP(AssumeTrueKHR, 5630)
_SPIRV_OP(ExpectKHR, 5631)
_SPIRV_OP(DecorateString, 5632)
_SPIRV_OP(MemberDecorateString, 5633)
_SPIRV_OP(VmeImageINTEL, 5699)
_SPIRV_OP(TypeVmeImageINTEL, 5700)
_SPIRV_OP(TypeAvcImePayloadINTEL, 5701)
Expand Down
33 changes: 33 additions & 0 deletions test/OpDecorateString_UserSemantic.spvasm
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
; REQUIRES: spirv-as
; RUN: spirv-as --target-env spv1.4 -o %t.spv %s
; RUN: spirv-val %t.spv
; RUN: llvm-spirv -emit-opaque-pointers -r -o - %t.spv | llvm-dis -opaque-pointers | FileCheck %s

; SPIR-V
; Version: 1.4
; Generator: Khronos LLVM/SPIR-V Translator; 14
; Bound: 40
; Schema: 0
OpCapability Addresses
OpCapability Linkage
OpCapability Kernel
OpMemoryModel Physical64 OpenCL
OpEntryPoint Kernel %kernel "test"
; Note: this is decorating a variable in the function storage class, which
; is not actually valid according to the SPIR-V spec, but is processed by
; the SPIR-V LLVM Translator and not rejected by spirv-val.
OpDecorateString %temp UserSemantic "foo"
; CHECK: [[STR:@[0-9_.]+]] = {{.*}}foo
; CHECK: call void @llvm.var.annotation(ptr %{{.*}}, ptr [[STR]], ptr undef, i32 undef, ptr undef)
%uint = OpTypeInt 32 0
%void = OpTypeVoid
%kernel_sig = OpTypeFunction %void %uint
%ptr_uint = OpTypePointer Function %uint
%kernel = OpFunction %void None %kernel_sig
%a = OpFunctionParameter %uint
%entry = OpLabel
%temp = OpVariable %ptr_uint Function
%add = OpIAdd %uint %a %a
OpStore %temp %add Aligned 4
OpReturn
OpFunctionEnd
37 changes: 37 additions & 0 deletions test/OpMemberDecorateString_UserSemantic.spvasm
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
; REQUIRES: spirv-as
; RUN: spirv-as --target-env spv1.4 -o %t.spv %s
; RUN: spirv-val %t.spv
; RUN: llvm-spirv -emit-opaque-pointers -r -o - %t.spv | llvm-dis | FileCheck %s

; SPIR-V
; Version: 1.4
; Generator: Khronos LLVM/SPIR-V Translator; 14
; Bound: 44
; Schema: 0
OpCapability Addresses
OpCapability Linkage
OpCapability Kernel
OpCapability Int64
OpMemoryModel Physical64 OpenCL
OpEntryPoint Kernel %kernel "test"
OpMemberDecorateString %struct 0 UserSemantic "foo"
; CHECK: [[STR:@[0-9_.]+]] = {{.*}}foo
; Note: this is checking for an annotation on an instantiation of the structure,
; which is different than an annotation on the structure type.
; CHECK: call ptr @llvm.ptr.annotation.p0(ptr %{{.*}}, ptr [[STR]], ptr undef, i32 undef, ptr undef)
%uint = OpTypeInt 32 0
%uint_0 = OpConstant %uint 0
%void = OpTypeVoid
%kernel_sig = OpTypeFunction %void %uint
%struct = OpTypeStruct %uint
%ptr_struct = OpTypePointer Function %struct
%ptr_uint = OpTypePointer Function %uint
%kernel = OpFunction %void None %kernel_sig
%a = OpFunctionParameter %uint
%entry = OpLabel
%s = OpVariable %ptr_struct Function
%add = OpIAdd %uint %a %a
%x = OpInBoundsPtrAccessChain %ptr_uint %s %uint_0 %uint_0
OpStore %x %add Aligned 4
OpReturn
OpFunctionEnd

0 comments on commit 2dadcf0

Please sign in to comment.