mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
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 <jason@jlekstrand.net>
- Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> )
Closes: #3787
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Signed-off-by: Andrii Simiklit <andrii.simiklit@globallogic.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7755>
This commit is contained in:
parent
edd12acbec
commit
4220befb38
1 changed files with 15 additions and 5 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue