Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Backport to 14] add reverse translation for OpDecorateString and OpMemberDecorateString #2778

Merged
merged 1 commit into from
Oct 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions lib/SPIRV/SPIRVReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3649,9 +3649,10 @@ void SPIRVToLLVM::transIntelFPGADecorations(SPIRVValue *BV, Value *V) {
if (!AnnotStr.empty()) {
auto *GS = Builder.CreateGlobalStringPtr(AnnotStr);

auto GEP = Builder.CreateConstInBoundsGEP2_32(AllocatedTy, AL, 0, I);
auto *GEP = cast<GetElementPtrInst>(
Builder.CreateConstInBoundsGEP2_32(AllocatedTy, AL, 0, I));

Type *IntTy = GEP->getType()->getPointerElementType()->isIntegerTy()
Type *IntTy = GEP->getResultElementType()->isIntegerTy()
? GEP->getType()
: Int8PtrTyPrivate;

Expand Down
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 --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 getelementptr inbounds ([4 x i8], ptr [[STR]], i32 0, i32 0), 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 --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: 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 getelementptr inbounds ([4 x i8], ptr [[STR]], i32 0, i32 0), 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
Loading