Mesa (staging/19.1): nir/repair_ssa: Repair dominance for unreachable blocks

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Sep 9 11:31:42 UTC 2019


Module: Mesa
Branch: staging/19.1
Commit: ff8122d5a2b5e8a7b2225be4a60a61fb55cbb9e3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ff8122d5a2b5e8a7b2225be4a60a61fb55cbb9e3

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Mon Sep  2 12:54:31 2019 -0500

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 at lists.freedesktop.org
Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
(cherry picked from commit a3268599f3c9bb1d92571e15df95750a06114811)

---

 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 f182818374d..b6ec1038843 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)));
       }




More information about the mesa-commit mailing list