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:
364212f1ede4b "nir: Add a pass to repair SSA form"
}
}
+ 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;
}
}
+ 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;
}