Skip to content

Commit 098034e

Browse files
DmitryBushevDmitry Sidorov
authored andcommitted
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 7d3a83f commit 098034e

File tree

3 files changed

+75
-23
lines changed

3 files changed

+75
-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)
@@ -1488,6 +1512,10 @@ Value *SPIRVToLLVM::transValueWithoutDecoration(SPIRVValue *BV, Function *F,
14881512
LVar->addAttribute(kVCMetadata::VCByteOffset, utostr(Offset));
14891513
if (BVar->hasDecorate(DecorationVolatile))
14901514
LVar->addAttribute(kVCMetadata::VCVolatile);
1515+
auto SEVAttr = translateSEVMetadata(BVar, LVar->getContext());
1516+
if (SEVAttr)
1517+
LVar->addAttribute(SEVAttr.getValue().getKindAsString(),
1518+
SEVAttr.getValue().getValueAsString());
14911519
}
14921520

14931521
return Res;
@@ -3853,9 +3881,10 @@ bool SPIRVToLLVM::transVectorComputeMetadata(SPIRVFunction *BF) {
38533881
if (BF->hasDecorate(DecorationSIMTCallINTEL, 0, &SIMTMode))
38543882
F->addFnAttr(kVCMetadata::VCSIMTCall, std::to_string(SIMTMode));
38553883

3856-
auto SEVAttr = Attribute::get(*Context, kVCMetadata::VCSingleElementVector);
3857-
if (BF->hasDecorate(DecorationSingleElementVectorINTEL))
3858-
F->addAttribute(AttributeList::ReturnIndex, SEVAttr);
3884+
auto SEVAttr = translateSEVMetadata(BF, F->getContext());
3885+
3886+
if (SEVAttr)
3887+
F->addAttribute(AttributeList::ReturnIndex, SEVAttr.getValue());
38593888

38603889
for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
38613890
++I) {
@@ -3867,8 +3896,9 @@ bool SPIRVToLLVM::transVectorComputeMetadata(SPIRVFunction *BF) {
38673896
std::to_string(Kind));
38683897
F->addAttribute(ArgNo + 1, Attr);
38693898
}
3870-
if (BA->hasDecorate(DecorationSingleElementVectorINTEL))
3871-
F->addAttribute(ArgNo + 1, SEVAttr);
3899+
SEVAttr = translateSEVMetadata(BA, F->getContext());
3900+
if (SEVAttr)
3901+
F->addAttribute(ArgNo + 1, SEVAttr.getValue());
38723902
}
38733903

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

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,24 @@ static bool shouldTryToAddMemAliasingDecoration(Instruction *Inst) {
141141
return true;
142142
}
143143

144+
static void translateSEVDecoration(Attribute Sev, SPIRVValue *Val) {
145+
assert(Sev.isStringAttribute() &&
146+
Sev.getKindAsString() == kVCMetadata::VCSingleElementVector);
147+
148+
auto *Ty = Val->getType();
149+
assert((Ty->isTypeBool() || Ty->isTypeFloat() || Ty->isTypeInt() ||
150+
Ty->isTypePointer()) &&
151+
"This decoration is valid only for Scalar or Pointer types");
152+
153+
if (Ty->isTypePointer()) {
154+
SPIRVWord IndirectLevelsOnElement = 0;
155+
Sev.getValueAsString().getAsInteger(0, IndirectLevelsOnElement);
156+
Val->addDecorate(DecorationSingleElementVectorINTEL,
157+
IndirectLevelsOnElement);
158+
} else
159+
Val->addDecorate(DecorationSingleElementVectorINTEL);
160+
}
161+
144162
LLVMToSPIRVBase::LLVMToSPIRVBase(SPIRVModule *SMod)
145163
: M(nullptr), Ctx(nullptr), BM(SMod), SrcLang(0), SrcLangVer(0) {
146164
DbgTran = std::make_unique<LLVMToSPIRVDbgTran>(nullptr, SMod, this);
@@ -710,14 +728,11 @@ void LLVMToSPIRVBase::transVectorComputeMetadata(Function *F) {
710728
}
711729

712730
if (Attrs.hasAttribute(AttributeList::ReturnIndex,
713-
kVCMetadata::VCSingleElementVector)) {
714-
auto *RT = BF->getType();
715-
(void)RT;
716-
assert((RT->isTypeBool() || RT->isTypeFloat() || RT->isTypeInt() ||
717-
RT->isTypePointer()) &&
718-
"This decoration is valid only for Scalar or Pointer types");
719-
BF->addDecorate(DecorationSingleElementVectorINTEL);
720-
}
731+
kVCMetadata::VCSingleElementVector))
732+
translateSEVDecoration(
733+
Attrs.getAttribute(AttributeList::ReturnIndex,
734+
kVCMetadata::VCSingleElementVector),
735+
BF);
721736

722737
for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E;
723738
++I) {
@@ -730,14 +745,10 @@ void LLVMToSPIRVBase::transVectorComputeMetadata(Function *F) {
730745
.getAsInteger(0, Kind);
731746
BA->addDecorate(DecorationFuncParamIOKindINTEL, Kind);
732747
}
733-
if (Attrs.hasAttribute(ArgNo + 1, kVCMetadata::VCSingleElementVector)) {
734-
auto *AT = BA->getType();
735-
(void)AT;
736-
assert((AT->isTypeBool() || AT->isTypeFloat() || AT->isTypeInt() ||
737-
AT->isTypePointer()) &&
738-
"This decoration is valid only for Scalar or Pointer types");
739-
BA->addDecorate(DecorationSingleElementVectorINTEL);
740-
}
748+
if (Attrs.hasAttribute(ArgNo + 1, kVCMetadata::VCSingleElementVector))
749+
translateSEVDecoration(
750+
Attrs.getAttribute(ArgNo + 1, kVCMetadata::VCSingleElementVector),
751+
BA);
741752
}
742753
if (!isKernel(F) &&
743754
BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_float_controls2) &&
@@ -1507,6 +1518,10 @@ LLVMToSPIRVBase::transValueWithoutDecoration(Value *V, SPIRVBasicBlock *BB,
15071518
}
15081519
if (GV->hasAttribute(kVCMetadata::VCVolatile))
15091520
BVar->addDecorate(DecorationVolatile);
1521+
1522+
if (GV->hasAttribute(kVCMetadata::VCSingleElementVector))
1523+
translateSEVDecoration(
1524+
GV->getAttribute(kVCMetadata::VCSingleElementVector), BVar);
15101525
}
15111526

15121527
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)