Skip to content

Commit 945a654

Browse files
vmaksimoMrSidims
andauthored
[Backport to 15] Fix SPV_INTEL_runtime_aligned implementation part 1 (#2617)
It was implemented via new decoration, which is not correct. Instead it should be Function Parameter Attribute decoration. In this commit starts fixing this in step-by-step manner. Signed-off-by: Sidorov, Dmitry <[email protected]> Co-authored-by: Maksimova, Viktoria <[email protected]> (This is a cherry-pick of 0db0f98) Co-authored-by: Dmitry Sidorov <[email protected]>
1 parent 7413e5a commit 945a654

File tree

4 files changed

+91
-16
lines changed

4 files changed

+91
-16
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,19 @@ static void addRuntimeAlignedMetadata(
196196
LLVMContext *Context, SPIRVFunction *BF, llvm::Function *Fn,
197197
std::function<Metadata *(SPIRVFunctionParameter *)> ForeachFnArg) {
198198
std::vector<Metadata *> ValueVec;
199-
bool DecorationFound = false;
199+
bool RuntimeAlignedFound = false;
200+
[[maybe_unused]] llvm::Metadata *DefaultNode =
201+
ConstantAsMetadata::get(ConstantInt::get(Type::getInt1Ty(*Context), 0));
200202
BF->foreachArgument([&](SPIRVFunctionParameter *Arg) {
201-
if (Arg->getType()->isTypePointer() &&
203+
if (Arg->hasAttr(FunctionParameterAttributeRuntimeAlignedINTEL) ||
202204
Arg->hasDecorate(internal::DecorationRuntimeAlignedINTEL)) {
203-
DecorationFound = true;
205+
RuntimeAlignedFound = true;
204206
ValueVec.push_back(ForeachFnArg(Arg));
205207
} else {
206-
llvm::Metadata *DefaultNode = ConstantAsMetadata::get(
207-
ConstantInt::get(Type::getInt1Ty(*Context), 0));
208208
ValueVec.push_back(DefaultNode);
209209
}
210210
});
211-
if (DecorationFound)
211+
if (RuntimeAlignedFound)
212212
Fn->setMetadata("kernel_arg_runtime_aligned",
213213
MDNode::get(*Context, ValueVec));
214214
}
@@ -2999,6 +2999,10 @@ void SPIRVToLLVM::transFunctionAttrs(SPIRVFunction *BF, Function *F) {
29992999
mapValue(BA, &(*I));
30003000
setName(&(*I), BA);
30013001
BA->foreachAttr([&](SPIRVFuncParamAttrKind Kind) {
3002+
// Skip this function parameter attribute as it will translated among
3003+
// OpenCL metadata
3004+
if (Kind == FunctionParameterAttributeRuntimeAlignedINTEL)
3005+
return;
30023006
Attribute::AttrKind LLVMKind = SPIRSPIRVFuncParamAttrMap::rmap(Kind);
30033007
Type *AttrTy = nullptr;
30043008
switch (LLVMKind) {
@@ -4369,13 +4373,8 @@ bool SPIRVToLLVM::transOCLMetadata(SPIRVFunction *BF) {
43694373
});
43704374
// Generate metadata for kernel_arg_runtime_aligned
43714375
addRuntimeAlignedMetadata(Context, BF, F, [=](SPIRVFunctionParameter *Arg) {
4372-
auto Literals =
4373-
Arg->getDecorationLiterals(internal::DecorationRuntimeAlignedINTEL);
4374-
assert(Literals.size() == 1 &&
4375-
"RuntimeAlignedINTEL decoration shall have 1 ID literal");
4376-
43774376
return ConstantAsMetadata::get(
4378-
ConstantInt::get(Type::getInt1Ty(*Context), Literals[0]));
4377+
ConstantInt::get(Type::getInt1Ty(*Context), 1));
43794378
});
43804379
return true;
43814380
}

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -893,12 +893,19 @@ SPIRVFunction *LLVMToSPIRVBase::transFunctionDecl(Function *F) {
893893
// Order of integer numbers in MD node follows the order of function
894894
// parameters on which we shall attach the appropriate decoration. Add
895895
// decoration only if MD value is 1.
896-
int LocID = 0;
896+
int IsRuntimeAligned = 0;
897897
if (!isa<MDString>(RuntimeAligned->getOperand(ArgNo)) &&
898898
!isa<MDNode>(RuntimeAligned->getOperand(ArgNo)))
899-
LocID = getMDOperandAsInt(RuntimeAligned, ArgNo);
900-
if (LocID == 1)
901-
BA->addDecorate(internal::DecorationRuntimeAlignedINTEL, LocID);
899+
IsRuntimeAligned = getMDOperandAsInt(RuntimeAligned, ArgNo);
900+
if (IsRuntimeAligned == 1) {
901+
// TODO: to replace non-conformant to the spec decoration generation
902+
// with:
903+
// BM->addExtension(ExtensionID::SPV_INTEL_runtime_aligned);
904+
// BM->addCapability(CapabilityRuntimeAlignedAttributeINTEL);
905+
// BA->addAttr(FunctionParameterAttributeRuntimeAlignedINTEL);
906+
BA->addDecorate(internal::DecorationRuntimeAlignedINTEL,
907+
IsRuntimeAligned);
908+
}
902909
}
903910
}
904911
if (Attrs.hasRetAttr(Attribute::ZExt))

lib/SPIRV/libSPIRV/SPIRVIsValidEnum.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ inline bool isValid(spv::FunctionParameterAttribute V) {
170170
case FunctionParameterAttributeNoCapture:
171171
case FunctionParameterAttributeNoWrite:
172172
case FunctionParameterAttributeNoReadWrite:
173+
case FunctionParameterAttributeRuntimeAlignedINTEL:
173174
return true;
174175
default:
175176
return false;
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
; RUN: llvm-spirv -spirv-text -r %s -o %t.bc
2+
; RUN: llvm-dis < %t.bc | FileCheck %s --check-prefix=CHECK-LLVM
3+
4+
; CHECK-LLVM: define spir_kernel void @test{{.*}} !kernel_arg_runtime_aligned ![[RTALIGN_MD:[0-9]+]] {{.*}}
5+
; CHECK-LLVM: ![[RTALIGN_MD]] = !{i1 true, i1 false, i1 true, i1 false, i1 false}
6+
7+
119734787 65536 393230 22 0
8+
2 Capability Addresses
9+
2 Capability Linkage
10+
2 Capability Kernel
11+
2 Capability Int8
12+
2 Capability RuntimeAlignedAttributeINTEL
13+
8 Extension "SPV_INTEL_runtime_aligned"
14+
5 ExtInstImport 1 "OpenCL.std"
15+
3 MemoryModel 2 2
16+
5 EntryPoint 6 14 "test"
17+
3 Source 0 0
18+
4 Name 7 "test"
19+
3 Name 8 "a"
20+
3 Name 9 "b"
21+
3 Name 10 "c"
22+
3 Name 11 "d"
23+
3 Name 12 "e"
24+
4 Name 13 "entry"
25+
3 Name 15 "a"
26+
3 Name 16 "b"
27+
3 Name 17 "c"
28+
3 Name 18 "d"
29+
3 Name 19 "e"
30+
31+
6 Decorate 7 LinkageAttributes "test" Export
32+
4 Decorate 8 FuncParamAttr 5940
33+
4 Decorate 10 FuncParamAttr 5940
34+
4 Decorate 15 FuncParamAttr 5940
35+
4 Decorate 17 FuncParamAttr 5940
36+
4 TypeInt 3 8 0
37+
4 TypeInt 5 32 0
38+
2 TypeVoid 2
39+
4 TypePointer 4 5 3
40+
8 TypeFunction 6 2 4 4 4 5 5
41+
42+
43+
44+
5 Function 2 7 0 6
45+
3 FunctionParameter 4 8
46+
3 FunctionParameter 4 9
47+
3 FunctionParameter 4 10
48+
3 FunctionParameter 5 11
49+
3 FunctionParameter 5 12
50+
51+
2 Label 13
52+
1 Return
53+
54+
1 FunctionEnd
55+
56+
5 Function 2 14 0 6
57+
3 FunctionParameter 4 15
58+
3 FunctionParameter 4 16
59+
3 FunctionParameter 4 17
60+
3 FunctionParameter 5 18
61+
3 FunctionParameter 5 19
62+
63+
2 Label 20
64+
9 FunctionCall 2 21 7 15 16 17 18 19
65+
1 Return
66+
67+
1 FunctionEnd
68+

0 commit comments

Comments
 (0)