[Mesa-dev] [PATCH 10/21] nir/dominance: Handle unreachable blocks

Connor Abbott cwabbott0 at gmail.com
Thu Feb 25 06:02:35 UTC 2016


I believe this is correct, and won't cause any issues with phi node
placement, etc. before dead_cf comes and gets rid any code in the
unreachable block(s).

Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>

BTW, I'd ask that you hold off on pushing this until I at least get a
chance to look at the phi builder stuff. I've already talked with you
about the return lowering pass, and the inlining itself shouldn't be
*that* bad, but when I glanced at the phi builder interface I couldn't
grasp quite what was going on.


On Sat, Feb 13, 2016 at 9:14 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> Previously, nir_dominance.c didn't properly handle unreachable blocks.
> This can happen if, for instance, you have something like this:
>
> loop {
>    if (...) {
>       break;
>    } else {
>       break;
>    }
> }
>
> In this case, the block right after the if statement will be unreachable.
> This commit makes two changes to handle this.  First, it removes an assert
> and allows block->imm_dom to be null if the block is unreachable.  Second,
> it properly skips unreachable blocks in calc_dom_frontier_cb.
>
> Cc: Connor Abbott <cwabbott0 at gmail.com>
> ---
>  src/compiler/nir/nir_dominance.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/nir/nir_dominance.c b/src/compiler/nir/nir_dominance.c
> index b345b85..d95f396 100644
> --- a/src/compiler/nir/nir_dominance.c
> +++ b/src/compiler/nir/nir_dominance.c
> @@ -94,7 +94,6 @@ calc_dominance_cb(nir_block *block, void *_state)
>        }
>     }
>
> -   assert(new_idom);
>     if (block->imm_dom != new_idom) {
>        block->imm_dom = new_idom;
>        state->progress = true;
> @@ -112,6 +111,11 @@ calc_dom_frontier_cb(nir_block *block, void *state)
>        struct set_entry *entry;
>        set_foreach(block->predecessors, entry) {
>           nir_block *runner = (nir_block *) entry->key;
> +
> +         /* Skip unreachable predecessors */
> +         if (runner->imm_dom == NULL)
> +            continue;
> +
>           while (runner != block->imm_dom) {
>              _mesa_set_add(runner->dom_frontier, block);
>              runner = runner->imm_dom;
> --
> 2.5.0.400.gff86faf
>


More information about the mesa-dev mailing list