nir/cf: Fix dominance metadata in the dead control flow pass.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 19 Sep 2015 11:40:07 +0000 (04:40 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 23 Sep 2015 18:00:00 +0000 (11:00 -0700)
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@whitecape.org>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/nir/nir_control_flow.c
src/glsl/nir/nir_opt_dead_cf.c

index 55d0689c45e2baf53d51bfb53e1c3e1e368350cc..7f51c4faf498768511c7469fdc8c7eeda1a9fd9c 100644 (file)
@@ -756,6 +756,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) {
index 317bbc5ba63381ab3a05f421697d5b64838c8956..0d4819b515813a75f30bd6667b2855570a06f0f8 100644 (file)
@@ -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);