From: Andrii Simiklit Date: Tue, 24 Nov 2020 12:28:12 +0000 (+0200) Subject: spirv: repair ssa defs for switchs with only default case X-Git-Tag: upstream/21.2.3~5266 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4220befb383112798b1afc1ba13419ed79470cba;p=platform%2Fupstream%2Fmesa.git spirv: repair ssa defs for switchs with only default case This fixes OpSwitch corner case when switch doesn't have any targets just a `default` and SSAs defined in it is used after switch block directly without phis. v2: Just use `repair_ssa` for all structured control-flow cases ( - Jason Ekstrand - Caio Marcelo de Oliveira Filho ) Closes: #3787 Reviewed-by: Caio Marcelo de Oliveira Filho Signed-off-by: Andrii Simiklit Part-of: --- diff --git a/src/compiler/spirv/vtn_cfg.c b/src/compiler/spirv/vtn_cfg.c index 8d0794e..dd91352 100644 --- a/src/compiler/spirv/vtn_cfg.c +++ b/src/compiler/spirv/vtn_cfg.c @@ -1393,12 +1393,22 @@ vtn_function_emit(struct vtn_builder *b, struct vtn_function *func, nir_rematerialize_derefs_in_use_blocks_impl(impl); - /* Continue blocks for loops get inserted before the body of the loop - * but instructions in the continue may use SSA defs in the loop body. - * Therefore, we need to repair SSA to insert the needed phi nodes. + /* + * There are some cases where we need to repair SSA to insert + * the needed phi nodes: + * + * - Continue blocks for loops get inserted before the body of the loop + * but instructions in the continue may use SSA defs in the loop body. + * + * - Early termination instructions `OpKill` and `OpTerminateInvocation`, + * in NIR. They're represented by regular intrinsics with no control-flow + * semantics. This means that the SSA form from the SPIR-V may not + * 100% match NIR. + * + * - Switches with only default case may also define SSA which may + * subsequently be used out of the switch. */ - if (func->nir_func->impl->structured && - (b->has_loop_continue || b->has_early_terminate)) + if (func->nir_func->impl->structured) nir_repair_ssa_impl(impl); func->emitted = true;