struct repair_ssa_state *state = void_state;
bool is_valid = true;
- nir_foreach_use(def, src) {
+ nir_foreach_use(src, def) {
if (!nir_block_dominates(def->parent_instr->block, get_src_block(src))) {
is_valid = false;
break;
}
}
+ 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;
BITSET_SET(state->def_set, def->parent_instr->block->index);
struct nir_phi_builder_value *val =
- nir_phi_builder_add_value(pb, def->num_components, state->def_set);
+ nir_phi_builder_add_value(pb, def->num_components, def->bit_size,
+ state->def_set);
nir_phi_builder_value_set_block_def(val, def->parent_instr->block, def);
- nir_foreach_use_safe(def, src) {
+ nir_foreach_use_safe(src, def) {
nir_block *src_block = get_src_block(src);
if (!nir_block_dominates(def->parent_instr->block, src_block)) {
nir_instr_rewrite_src(src->parent_instr, src, nir_src_for_ssa(
}
}
- return true;
-}
-
-static bool
-repair_ssa_block(nir_block *block, void *state)
-{
- nir_foreach_instr_safe(block, instr) {
- nir_foreach_ssa_def(instr, repair_ssa_def, 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;
nir_metadata_require(impl, nir_metadata_block_index |
nir_metadata_dominance);
- nir_foreach_block(impl, repair_ssa_block, &state);
+ nir_foreach_block(block, impl) {
+ nir_foreach_instr_safe(instr, block) {
+ nir_foreach_ssa_def(instr, repair_ssa_def, &state);
+ }
+ }
if (state.progress)
nir_metadata_preserve(impl, nir_metadata_block_index |
{
bool progress = false;
- nir_foreach_function(shader, function) {
+ nir_foreach_function(function, shader) {
if (function->impl)
progress = nir_repair_ssa_impl(function->impl) || progress;
}