aboutsummaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2015-09-19 04:40:07 -0700
committerKenneth Graunke <[email protected]>2015-09-23 11:00:00 -0700
commitfbaa1b19d7accc5de95d6804525aad5b95abba72 (patch)
tree721f69fb7c82f57c7588baa7f860f20ac17e7d4d /src/glsl
parent6560838703431f89c47d68822758bc76fd34c355 (diff)
nir/cf: Fix dominance metadata in the dead control flow pass.
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 <[email protected]> Reviewed-by: Connor Abbott <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/nir/nir_control_flow.c3
-rw-r--r--src/glsl/nir/nir_opt_dead_cf.c7
2 files changed, 7 insertions, 3 deletions
diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
index 55d0689c45e..7f51c4faf49 100644
--- a/src/glsl/nir/nir_control_flow.c
+++ b/src/glsl/nir/nir_control_flow.c
@@ -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) {
diff --git a/src/glsl/nir/nir_opt_dead_cf.c b/src/glsl/nir/nir_opt_dead_cf.c
index 317bbc5ba63..0d4819b5158 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);