[Mesa-dev] [PATCH 07/11] nir/cf: Fix dominance metadata in the dead control flow pass.

Connor Abbott cwabbott0 at gmail.com
Tue Sep 22 21:37:29 PDT 2015


On Tue, Sep 22, 2015 at 11:01 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> The NIR control flow modification API churns the block structure,
> splitting blocks, stitching them back together, and so on.  Preserving
> information about block dominance is hard (and probably not worthwhile).
>
> This patch makes nir_cf_extract() throw away all metadata, like we do
> when adding/removing jumps.
>
> We then make the dead control flow pass compute dominance information
> right before it uses it.  This is necessary because earlier work by the
> pass may have invalidated it.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>

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

> ---
>  src/glsl/nir/nir_control_flow.c | 3 +++
>  src/glsl/nir/nir_opt_dead_cf.c  | 7 ++++---
>  2 files changed, 7 insertions(+), 3 deletions(-)
>
> New patch!
>
> diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
> index e027766..8ec1252 100644
> --- a/src/glsl/nir/nir_control_flow.c
> +++ b/src/glsl/nir/nir_control_flow.c
> @@ -742,6 +742,9 @@ nir_cf_extract(nir_cf_list *extracted, nir_cursor begin, nir_cursor end)
>     extracted->impl = nir_cf_node_get_function(&block_begin->cf_node);
>     exec_list_make_empty(&extracted->list);
>
> +   /* Dominance and other block-related information is toast. */
> +   nir_metadata_preserve(extracted->impl, nir_metadata_none);
> +
>     nir_cf_node *cf_node = &block_begin->cf_node;
>     nir_cf_node *cf_node_end = &block_end->cf_node;
>     while (true) {
> diff --git a/src/glsl/nir/nir_opt_dead_cf.c b/src/glsl/nir/nir_opt_dead_cf.c
> index 317bbc5..0d4819b 100644
> --- a/src/glsl/nir/nir_opt_dead_cf.c
> +++ b/src/glsl/nir/nir_opt_dead_cf.c
> @@ -203,6 +203,10 @@ loop_is_dead(nir_loop *loop)
>                                       NULL))
>        return false;
>
> +   nir_function_impl *impl = nir_cf_node_get_function(&loop->cf_node);
> +   nir_metadata_require(impl, nir_metadata_live_variables |
> +                              nir_metadata_dominance);
> +
>     for (nir_block *cur = after->imm_dom; cur != before; cur = cur->imm_dom) {
>        nir_foreach_instr(cur, instr) {
>           if (!nir_foreach_ssa_def(instr, def_not_live_out, after))
> @@ -332,9 +336,6 @@ dead_cf_list(struct exec_list *list, bool *list_ends_in_jump)
>  static bool
>  opt_dead_cf_impl(nir_function_impl *impl)
>  {
> -   nir_metadata_require(impl, nir_metadata_live_variables |
> -                              nir_metadata_dominance);
> -
>     bool dummy;
>     bool progress = dead_cf_list(&impl->body, &dummy);
>
> --
> 2.5.3
>


More information about the mesa-dev mailing list