[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