From a3268599f3c9bb1d92571e15df95750a06114811 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 2 Sep 2019 12:54:31 -0500 Subject: [PATCH] nir/repair_ssa: Repair dominance for unreachable blocks NIR currently assumes that unreachable blocks are trivially dominated by everything. However, when considering well-formed SSA, there is no path from any block to an unreachable block. Therefore, we can break any use-def chains where the use is in an unreachable block. This removes any dependencies on code created by uses in unreachable blocks and lets DCE do a better job of cleaning it up. Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Caio Marcelo de Oliveira Filho --- src/compiler/nir/nir_repair_ssa.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_repair_ssa.c b/src/compiler/nir/nir_repair_ssa.c index f182818..b6ec103 100644 --- a/src/compiler/nir/nir_repair_ssa.c +++ b/src/compiler/nir/nir_repair_ssa.c @@ -71,7 +71,8 @@ repair_ssa_def(nir_ssa_def *def, void *void_state) bool is_valid = true; nir_foreach_use(src, def) { - if (!nir_block_dominates(def->parent_instr->block, get_src_block(src))) { + if (nir_block_is_unreachable(get_src_block(src)) || + !nir_block_dominates(def->parent_instr->block, get_src_block(src))) { is_valid = false; break; } @@ -80,7 +81,8 @@ 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)) { + if (nir_block_is_unreachable(block_before_if) || + !nir_block_dominates(def->parent_instr->block, block_before_if)) { is_valid = false; break; } @@ -101,7 +103,8 @@ repair_ssa_def(nir_ssa_def *def, void *void_state) nir_foreach_use_safe(src, def) { nir_block *src_block = get_src_block(src); - if (!nir_block_dominates(def->parent_instr->block, src_block)) { + if (nir_block_is_unreachable(src_block) || + !nir_block_dominates(def->parent_instr->block, src_block)) { nir_instr_rewrite_src(src->parent_instr, src, nir_src_for_ssa( nir_phi_builder_value_get_block_def(val, src_block))); } @@ -110,7 +113,8 @@ 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)) { + if (nir_block_is_unreachable(block_before_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))); } -- 2.7.4