Skip to content

Commit adc930c

Browse files
committed
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.
1 parent c04b226 commit adc930c

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4106,7 +4106,7 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
41064106
SPRetTy = transType(F->arg_begin()->getType()->getPointerElementType());
41074107
Args.erase(Args.begin());
41084108
}
4109-
auto SPI = BM->addInstTemplate(OC, BB, SPRetTy);
4109+
auto *SPI = SPIRVInstTemplateBase::create(OC);
41104110
std::vector<SPIRVWord> SPArgs;
41114111
for (size_t I = 0, E = Args.size(); I != E; ++I) {
41124112
assert((!isFunctionPointerType(Args[I]->getType()) ||
@@ -4116,7 +4116,7 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
41164116
? cast<ConstantInt>(Args[I])->getZExtValue()
41174117
: transValue(Args[I], BB)->getId());
41184118
}
4119-
SPI->setOpWordsAndValidate(SPArgs);
4119+
BM->addInstTemplate(SPI, SPArgs, BB, SPRetTy);
41204120
if (!SPRetTy || !SPRetTy->isTypeStruct())
41214121
return SPI;
41224122
std::vector<SPIRVWord> Mem;

lib/SPIRV/libSPIRV/SPIRVModule.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ class SPIRVModuleImpl : public SPIRVModule {
361361
const std::vector<SPIRVWord> &Ops,
362362
SPIRVBasicBlock *BB,
363363
SPIRVType *Ty) override;
364+
void addInstTemplate(SPIRVInstTemplateBase *Ins,
365+
const std::vector<SPIRVWord> &Ops, SPIRVBasicBlock *BB,
366+
SPIRVType *Ty) override;
364367
SPIRVInstruction *addLifetimeInst(Op OC, SPIRVValue *Object, SPIRVWord Size,
365368
SPIRVBasicBlock *BB) override;
366369
SPIRVInstruction *addMemoryBarrierInst(Scope ScopeKind, SPIRVWord MemFlag,
@@ -2086,6 +2089,16 @@ SPIRVModuleImpl::addInstTemplate(Op OC, const std::vector<SPIRVWord> &Ops,
20862089
return Ins;
20872090
}
20882091

2092+
void SPIRVModuleImpl::addInstTemplate(SPIRVInstTemplateBase *Ins,
2093+
const std::vector<SPIRVWord> &Ops,
2094+
SPIRVBasicBlock *BB, SPIRVType *Ty) {
2095+
assert(!Ty || !Ty->isTypeVoid());
2096+
SPIRVId Id = Ty ? getId() : SPIRVID_INVALID;
2097+
Ins->init(Ty, Id, BB, this);
2098+
Ins->setOpWordsAndValidate(Ops);
2099+
BB->addInstruction(Ins);
2100+
}
2101+
20892102
SPIRVId SPIRVModuleImpl::getExtInstSetId(SPIRVExtInstSetKind Kind) const {
20902103
assert(Kind < SPIRVEIS_Count && "Unknown extended instruction set!");
20912104
auto Res = ExtInstSetIds.find(Kind);

lib/SPIRV/libSPIRV/SPIRVModule.h

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

0 commit comments

Comments
 (0)