mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
nir: Take if_uses into account when repairing SSA
If a def is used as an condition before its definition, we should also consider this a case to repair. When repairing, make sure we rewrite any if conditions too. Found in while inspecting a SPIR-V conversion from a 'continue block' that contains a conditional branch. We pull the continue block up to the beggining of the loop, and the condition in the branch ends up defined afterwards. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Fixes:364212f1ed"nir: Add a pass to repair SSA form" (cherry picked from commitc037dbb0ef)
This commit is contained in:
parent
73bc3248f4
commit
b493686860
1 changed files with 18 additions and 0 deletions
|
|
@ -77,6 +77,15 @@ repair_ssa_def(nir_ssa_def *def, void *void_state)
|
|||
}
|
||||
}
|
||||
|
||||
nir_foreach_if_use(src, def) {
|
||||
nir_block *block_before_if =
|
||||
nir_cf_node_as_block(nir_cf_node_prev(&src->parent_if->cf_node));
|
||||
if (!nir_block_dominates(def->parent_instr->block, block_before_if)) {
|
||||
is_valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_valid)
|
||||
return true;
|
||||
|
||||
|
|
@ -98,6 +107,15 @@ repair_ssa_def(nir_ssa_def *def, void *void_state)
|
|||
}
|
||||
}
|
||||
|
||||
nir_foreach_if_use_safe(src, def) {
|
||||
nir_block *block_before_if =
|
||||
nir_cf_node_as_block(nir_cf_node_prev(&src->parent_if->cf_node));
|
||||
if (!nir_block_dominates(def->parent_instr->block, block_before_if)) {
|
||||
nir_if_rewrite_condition(src->parent_if, nir_src_for_ssa(
|
||||
nir_phi_builder_value_get_block_def(val, block_before_if)));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue