On Tue, Sep 22, 2015 at 11:01 PM, Kenneth Graunke <kenn...@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 <kenn...@whitecape.org>
Reviewed-by: Connor Abbott <cwabbo...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev