spirv: Add support for self-referencing phi nodes

This commit is contained in:
ReinUsesLisp 2021-02-24 18:31:32 -03:00 committed by ameerj
parent e87a502da2
commit 7496bbf758
1 changed files with 10 additions and 3 deletions

View File

@ -217,11 +217,18 @@ Id EmitPhi(EmitContext& ctx, IR::Inst* inst) {
IR::Inst* const arg_inst{arg.Inst()}; IR::Inst* const arg_inst{arg.Inst()};
def = arg_inst->Definition<Id>(); def = arg_inst->Definition<Id>();
if (!Sirit::ValidId(def)) { if (!Sirit::ValidId(def)) {
// If it hasn't been defined, get a forward declaration if (arg_inst == inst) {
// This is a self referencing phi node
def = ctx.CurrentId();
// Self-referencing definition will be set by the caller
} else {
// If it hasn't been defined and it's not a self reference,
// get a forward declaration
def = ctx.ForwardDeclarationId(); def = ctx.ForwardDeclarationId();
arg_inst->SetDefinition<Id>(def); arg_inst->SetDefinition<Id>(def);
} }
} }
}
IR::Block* const phi_block{inst->PhiBlock(index)}; IR::Block* const phi_block{inst->PhiBlock(index)};
operands.push_back(def); operands.push_back(def);
operands.push_back(phi_block->Definition<Id>()); operands.push_back(phi_block->Definition<Id>());