Skip to content

Commit f381bde

Browse files
svenvhvmaksimo
authored andcommitted
Change SPIRVInstTemplate creation order
In a followup commit, an instruction's required capabilities will depend on its argument types. This does not work with the current LLVM-to-SPIR-V translation that consists of the following steps: 1. Create the instruction without operands. 2. Add it to the module (which queries the instruction's required capabilities). 3. Add operands. Swap steps 2 and 3, such that the instruction is fully constructed before querying its required capabilities. Original commit: KhronosGroup/SPIRV-LLVM-Translator@adc930c
1 parent 6f23e98 commit f381bde

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4125,7 +4125,7 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
41254125
SPRetTy = transType(F->arg_begin()->getType()->getPointerElementType());
41264126
Args.erase(Args.begin());
41274127
}
4128-
auto SPI = BM->addInstTemplate(OC, BB, SPRetTy);
4128+
auto *SPI = SPIRVInstTemplateBase::create(OC);
41294129
std::vector<SPIRVWord> SPArgs;
41304130
for (size_t I = 0, E = Args.size(); I != E; ++I) {
41314131
assert((!isFunctionPointerType(Args[I]->getType()) ||
@@ -4135,7 +4135,7 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
41354135
? cast<ConstantInt>(Args[I])->getZExtValue()
41364136
: transValue(Args[I], BB)->getId());
41374137
}
4138-
SPI->setOpWordsAndValidate(SPArgs);
4138+
BM->addInstTemplate(SPI, SPArgs, BB, SPRetTy);
41394139
if (!SPRetTy || !SPRetTy->isTypeStruct())
41404140
return SPI;
41414141
std::vector<SPIRVWord> Mem;

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVModule.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ class SPIRVModuleImpl : public SPIRVModule {
359359
const std::vector<SPIRVWord> &Ops,
360360
SPIRVBasicBlock *BB,
361361
SPIRVType *Ty) override;
362+
void addInstTemplate(SPIRVInstTemplateBase *Ins,
363+
const std::vector<SPIRVWord> &Ops, SPIRVBasicBlock *BB,
364+
SPIRVType *Ty) override;
362365
SPIRVInstruction *addLifetimeInst(Op OC, SPIRVValue *Object, SPIRVWord Size,
363366
SPIRVBasicBlock *BB) override;
364367
SPIRVInstruction *addMemoryBarrierInst(Scope ScopeKind, SPIRVWord MemFlag,
@@ -2071,6 +2074,16 @@ SPIRVModuleImpl::addInstTemplate(Op OC, const std::vector<SPIRVWord> &Ops,
20712074
return Ins;
20722075
}
20732076

2077+
void SPIRVModuleImpl::addInstTemplate(SPIRVInstTemplateBase *Ins,
2078+
const std::vector<SPIRVWord> &Ops,
2079+
SPIRVBasicBlock *BB, SPIRVType *Ty) {
2080+
assert(!Ty || !Ty->isTypeVoid());
2081+
SPIRVId Id = Ty ? getId() : SPIRVID_INVALID;
2082+
Ins->init(Ty, Id, BB, this);
2083+
Ins->setOpWordsAndValidate(Ops);
2084+
BB->addInstruction(Ins);
2085+
}
2086+
20742087
SPIRVId SPIRVModuleImpl::getExtInstSetId(SPIRVExtInstSetKind Kind) const {
20752088
assert(Kind < SPIRVEIS_Count && "Unknown extended instruction set!");
20762089
auto Res = ExtInstSetIds.find(Kind);

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVModule.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ class SPIRVModule {
360360
virtual SPIRVInstTemplateBase *
361361
addInstTemplate(Op OC, const std::vector<SPIRVWord> &Ops, SPIRVBasicBlock *BB,
362362
SPIRVType *Ty) = 0;
363+
virtual void addInstTemplate(SPIRVInstTemplateBase *Ins,
364+
const std::vector<SPIRVWord> &Ops,
365+
SPIRVBasicBlock *BB, SPIRVType *Ty) = 0;
363366
virtual SPIRVInstruction *addLoadInst(SPIRVValue *,
364367
const std::vector<SPIRVWord> &,
365368
SPIRVBasicBlock *) = 0;

0 commit comments

Comments
 (0)