aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-01-17 18:38:39 -0800
committerMarge Bot <[email protected]>2020-04-20 03:46:29 +0000
commitdca3f351e5b70afd1a0088b829f9b45617c2e538 (patch)
treedd9d1ece0f3f8cb791ec2f9f22a01057b0f9df30 /src
parent5b1615fdb75659cb02fcbcd684046eabdb807930 (diff)
nir/gcm: Add a real concept of "progress"
Now that the GCM pass is more conservative and only moves instructions to different blocks when it's advantageous to do so, we can have a proper notion of what it means to make progress. Reviewed-by: Kenneth Graunke <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4636>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_opt_gcm.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c
index 375f9e71b57..aa20ab1667f 100644
--- a/src/compiler/nir/nir_opt_gcm.c
+++ b/src/compiler/nir/nir_opt_gcm.c
@@ -64,6 +64,8 @@ struct gcm_state {
nir_function_impl *impl;
nir_instr *instr;
+ bool progress;
+
/* The list of non-pinned instructions. As we do the late scheduling,
* we pull non-pinned instructions out of their blocks and place them in
* this list. This saves us from having linked-list problems when we go
@@ -354,9 +356,14 @@ gcm_schedule_late_def(nir_ssa_def *def, void *void_state)
* We now walk up the dominance tree and pick the lowest block that is
* as far outside loops as we can get.
*/
- def->parent_instr->block =
+ nir_block *best_block =
gcm_choose_block_for_instr(def->parent_instr, early_block, lca, state);
+ if (def->parent_instr->block != best_block)
+ state->progress = true;
+
+ def->parent_instr->block = best_block;
+
return true;
}
@@ -484,6 +491,7 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number)
state.impl = impl;
state.instr = NULL;
+ state.progress = false;
exec_list_make_empty(&state.instrs);
state.blocks = rzalloc_array(NULL, struct gcm_block_info, impl->num_blocks);
@@ -494,13 +502,12 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number)
state.instr_infos =
rzalloc_array(NULL, struct gcm_instr_info, state.num_instrs);
- bool progress = false;
if (value_number) {
struct set *gvn_set = nir_instr_set_create(NULL);
foreach_list_typed_safe(nir_instr, instr, node, &state.instrs) {
if (nir_instr_set_add_or_rewrite(gvn_set, instr)) {
nir_instr_remove(instr);
- progress = true;
+ state.progress = true;
}
}
nir_instr_set_destroy(gvn_set);
@@ -524,7 +531,7 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number)
nir_metadata_preserve(impl, nir_metadata_block_index |
nir_metadata_dominance);
- return progress;
+ return state.progress;
}
bool