Skip to content

Commit 4eb63bf

Browse files
authored
Amend SingleElementVectorINTEL decoration use cases according to spec update (#1192)
DecorationSingleElementVectorINTEl now has one extra operand representing number of pointer stars owned by the element of vector. It helps to restore scalars after translation back. Eg: <i32* x 1>** -> i32*** "VCSingleElementVector"="1" Also it now can be applied to global variables.
1 parent a4ac292 commit 4eb63bf

File tree

3 files changed

+74
-23
lines changed

3 files changed

+74
-23
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,30 @@ Value *SPIRVToLLVM::getTranslatedValue(SPIRVValue *BV) {
220220
return nullptr;
221221
}
222222

223+
static llvm::Optional<llvm::Attribute>
224+
translateSEVMetadata(SPIRVValue *BV, llvm::LLVMContext &Context) {
225+
llvm::Optional<llvm::Attribute> RetAttr;
226+
227+
if (!BV->hasDecorate(DecorationSingleElementVectorINTEL))
228+
return RetAttr;
229+
230+
auto VecDecorateSEV = BV->getDecorations(DecorationSingleElementVectorINTEL);
231+
assert(VecDecorateSEV.size() == 1 &&
232+
"Entry must have no more than one SingleElementVectorINTEL "
233+
"decoration");
234+
auto *DecorateSEV = VecDecorateSEV.back();
235+
auto LiteralCount = DecorateSEV->getLiteralCount();
236+
assert(LiteralCount <= 1 && "SingleElementVectorINTEL decoration must "
237+
"have no more than one literal");
238+
239+
SPIRVWord IndirectLevelsOnElement =
240+
(LiteralCount == 1) ? DecorateSEV->getLiteral(0) : 0;
241+
242+
RetAttr = Attribute::get(Context, kVCMetadata::VCSingleElementVector,
243+
std::to_string(IndirectLevelsOnElement));
244+
return RetAttr;
245+
}
246+
223247
IntrinsicInst *SPIRVToLLVM::getLifetimeStartIntrinsic(Instruction *I) {
224248
auto II = dyn_cast<IntrinsicInst>(I);
225249
if (II && II->getIntrinsicID() == Intrinsic::lifetime_start)
@@ -1510,6 +1534,10 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
15101534
LVar->addAttribute(kVCMetadata::VCByteOffset, utostr(Offset));
15111535
if (BVar->hasDecorate(DecorationVolatile))
15121536
LVar->addAttribute(kVCMetadata::VCVolatile);
1537+
auto SEVAttr = translateSEVMetadata(BVar, LVar->getContext());
1538+
if (SEVAttr)
1539+
LVar->addAttribute(SEVAttr.getValue().getKindAsString(),
1540+
SEVAttr.getValue().getValueAsString());
15131541
}
15141542

15151543
return Res;
@@ -3885,9 +3913,10 @@ bool SPIRVToLLVM::transVectorComputeMetadata(SPIRVFunction *BF) {
38853913
if (BF->hasDecorate(DecorationSIMTCallINTEL, 0, &SIMTMode))
38863914
F->addFnAttr(kVCMetadata::VCSIMTCall, std::to_string(SIMTMode));
38873915

3888-
auto SEVAttr = Attribute::get(*Context, kVCMetadata::VCSingleElementVector);
3889-
if (BF->hasDecorate(DecorationSingleElementVectorINTEL))
3890-
F->addAttributeAtIndex(AttributeList::ReturnIndex, SEVAttr);
3916+
auto SEVAttr = translateSEVMetadata(BF, F->getContext());
3917+
3918+
if (SEVAttr)
3919+
F->addAttributeAtIndex(AttributeList::ReturnIndex, SEVAttr.getValue());
38913920

38923921
for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
38933922
++I) {
@@ -3899,8 +3928,9 @@ bool SPIRVToLLVM::transVectorComputeMetadata(SPIRVFunction *BF) {
38993928
std::to_string(Kind));
39003929
F->addParamAttr(ArgNo, Attr);
39013930
}
3902-
if (BA->hasDecorate(DecorationSingleElementVectorINTEL))
3903-
F->addParamAttr(ArgNo, SEVAttr);
3931+
SEVAttr = translateSEVMetadata(BA, F->getContext());
3932+
if (SEVAttr)
3933+
F->addParamAttr(ArgNo, SEVAttr.getValue());
39043934
}
39053935

39063936
// Do not add float control if there is no any

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,24 @@ static SPIRVMemoryModelKind getMemoryModel(Module &M) {
122122
return SPIRVMemoryModelKind::MemoryModelMax;
123123
}
124124

125+
static void translateSEVDecoration(Attribute Sev, SPIRVValue *Val) {
126+
assert(Sev.isStringAttribute() &&
127+
Sev.getKindAsString() == kVCMetadata::VCSingleElementVector);
128+
129+
auto *Ty = Val->getType();
130+
assert((Ty->isTypeBool() || Ty->isTypeFloat() || Ty->isTypeInt() ||
131+
Ty->isTypePointer()) &&
132+
"This decoration is valid only for Scalar or Pointer types");
133+
134+
if (Ty->isTypePointer()) {
135+
SPIRVWord IndirectLevelsOnElement = 0;
136+
Sev.getValueAsString().getAsInteger(0, IndirectLevelsOnElement);
137+
Val->addDecorate(DecorationSingleElementVectorINTEL,
138+
IndirectLevelsOnElement);
139+
} else
140+
Val->addDecorate(DecorationSingleElementVectorINTEL);
141+
}
142+
125143
LLVMToSPIRVBase::LLVMToSPIRVBase(SPIRVModule *SMod)
126144
: M(nullptr), Ctx(nullptr), BM(SMod), SrcLang(0), SrcLangVer(0) {
127145
DbgTran = std::make_unique<LLVMToSPIRVDbgTran>(nullptr, SMod, this);
@@ -720,14 +738,11 @@ void LLVMToSPIRVBase::transVectorComputeMetadata(Function *F) {
720738
BF->addDecorate(DecorationSIMTCallINTEL, SIMTMode);
721739
}
722740

723-
if (Attrs.hasRetAttr(kVCMetadata::VCSingleElementVector)) {
724-
auto *RT = BF->getType();
725-
(void)RT;
726-
assert((RT->isTypeBool() || RT->isTypeFloat() || RT->isTypeInt() ||
727-
RT->isTypePointer()) &&
728-
"This decoration is valid only for Scalar or Pointer types");
729-
BF->addDecorate(DecorationSingleElementVectorINTEL);
730-
}
741+
if (Attrs.hasRetAttr(kVCMetadata::VCSingleElementVector))
742+
translateSEVDecoration(
743+
Attrs.getAttributeAtIndex(AttributeList::ReturnIndex,
744+
kVCMetadata::VCSingleElementVector),
745+
BF);
731746

732747
for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
733748
++I) {
@@ -740,14 +755,9 @@ void LLVMToSPIRVBase::transVectorComputeMetadata(Function *F) {
740755
.getAsInteger(0, Kind);
741756
BA->addDecorate(DecorationFuncParamIOKindINTEL, Kind);
742757
}
743-
if (Attrs.hasParamAttr(ArgNo, kVCMetadata::VCSingleElementVector)) {
744-
auto *AT = BA->getType();
745-
(void)AT;
746-
assert((AT->isTypeBool() || AT->isTypeFloat() || AT->isTypeInt() ||
747-
AT->isTypePointer()) &&
748-
"This decoration is valid only for Scalar or Pointer types");
749-
BA->addDecorate(DecorationSingleElementVectorINTEL);
750-
}
758+
if (Attrs.hasParamAttr(ArgNo, kVCMetadata::VCSingleElementVector))
759+
translateSEVDecoration(
760+
Attrs.getParamAttr(ArgNo, kVCMetadata::VCSingleElementVector), BA);
751761
}
752762
if (!isKernel(F) &&
753763
BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_float_controls2) &&
@@ -1519,6 +1529,10 @@ LLVMToSPIRVBase::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
15191529
}
15201530
if (GV->hasAttribute(kVCMetadata::VCVolatile))
15211531
BVar->addDecorate(DecorationVolatile);
1532+
1533+
if (GV->hasAttribute(kVCMetadata::VCSingleElementVector))
1534+
translateSEVDecoration(
1535+
GV->getAttribute(kVCMetadata::VCSingleElementVector), BVar);
15221536
}
15231537

15241538
mapValue(V, BVar);

test/transcoding/SPV_INTEL_vector_compute/decoration_single_element_vector.ll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@ target datalayout = "e-p:64:64-i64:64-n8:16:32"
1212
target triple = "spir64"
1313

1414

15+
@global_var = external global i32** #2
1516

1617
; SPV-DAG: Name [[def:[0-9]+]] "_Z24__cm_intrinsic_impl_sdivu2CMvb1_cS_"
1718
; SPV-DAG: Name [[a:[0-9]+]] "a"
1819
; SPV-DAG: Name [[b:[0-9]+]] "b"
20+
; SPV-DAG: Name [[glob:[0-9]+]] "global_var"
1921
; SPV-DAG: Decorate [[def]] SingleElementVectorINTEL
2022
; SPV-DAG: Decorate [[a]] SingleElementVectorINTEL
2123
; SPV-DAG: Decorate [[b]] SingleElementVectorINTEL
24+
; SPV-DAG: Decorate [[glob]] SingleElementVectorINTEL 2
2225

23-
; LLVM-DAG: "VCSingleElementVector" i8 @_Z24__cm_intrinsic_impl_sdivu2CMvb1_cS_(i8 "VCSingleElementVector" %a, i8 "VCSingleElementVector" %b)
24-
; LLVM-DAG: i8 @some.unknown.intrinsic(i8 "VCSingleElementVector", i8)
26+
; LLVM-DAG: "VCSingleElementVector"="0" i8 @_Z24__cm_intrinsic_impl_sdivu2CMvb1_cS_(i8 "VCSingleElementVector"="0" %a, i8 "VCSingleElementVector"="0" %b)
27+
; LLVM-DAG: i8 @some.unknown.intrinsic(i8 "VCSingleElementVector"="0", i8)
2528
; Function Attrs: noinline norecurse nounwind readnone
2629
define dso_local "VCSingleElementVector" i8 @_Z24__cm_intrinsic_impl_sdivu2CMvb1_cS_(i8 "VCSingleElementVector" %a, i8 "VCSingleElementVector" %b) local_unnamed_addr #1 {
2730
entry:
@@ -47,4 +50,8 @@ entry:
4750
; Function Attrs: nounwind readnone
4851
declare i8 @some.unknown.intrinsic(i8 "VCSingleElementVector", i8) #1
4952

53+
; LLVM: "VCGlobalVariable"
54+
; LLVM-SAME: "VCSingleElementVector"="2"
55+
5056
attributes #1 = { noinline norecurse nounwind readnone "VCFunction"}
57+
attributes #2 = { "VCGlobalVariable" "VCSingleElementVector"="2" }

0 commit comments

Comments
 (0)