nir: Apply passes to all functions

Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29577>
This commit is contained in:
Friedrich Vock 2024-01-07 22:41:33 +01:00 committed by Marge Bot
parent bb40284f76
commit a8ce60eec1
3 changed files with 27 additions and 20 deletions

View file

@ -1458,8 +1458,10 @@ void
nir_divergence_analysis(nir_shader *shader)
{
shader->info.divergence_analysis_run = true;
nir_divergence_analysis_impl(nir_shader_get_entrypoint(shader),
shader->options->divergence_analysis_options);
nir_foreach_function_impl(impl, shader) {
nir_divergence_analysis_impl(impl,
shader->options->divergence_analysis_options);
}
}
/* Compute divergence between vertices of the same primitive. This uses
@ -1474,7 +1476,6 @@ nir_vertex_divergence_analysis(nir_shader *shader)
struct divergence_state state = {
.stage = shader->info.stage,
.shader = shader,
.impl = nir_shader_get_entrypoint(shader),
.options = shader->options->divergence_analysis_options,
.loop = NULL,
.loop_all_invariant = false,
@ -1482,10 +1483,12 @@ nir_vertex_divergence_analysis(nir_shader *shader)
.first_visit = true,
};
nir_metadata_require(nir_shader_get_entrypoint(shader),
nir_metadata_block_index);
visit_cf_list(&nir_shader_get_entrypoint(shader)->body, &state);
nir_metadata_preserve(nir_shader_get_entrypoint(shader), nir_metadata_all);
nir_foreach_function_impl(impl, shader) {
nir_metadata_require(impl, nir_metadata_block_index);
state.impl = impl;
visit_cf_list(&impl->body, &state);
nir_metadata_preserve(impl, nir_metadata_all);
}
}
bool

View file

@ -956,7 +956,8 @@ gather_func_info(nir_function_impl *func, nir_shader *shader,
if (!call->indirect_callee.ssa)
assert(impl || !"nir_shader_gather_info only works with linked shaders");
gather_func_info(impl, shader, visited_funcs, dead_ctx);
if (impl)
gather_func_info(impl, shader, visited_funcs, dead_ctx);
break;
}
default:

View file

@ -229,21 +229,24 @@ nir_lower_memory_model(nir_shader *shader)
{
bool progress = false;
nir_function_impl *impl = nir_shader_get_entrypoint(shader);
struct exec_list *cf_list = &impl->body;
nir_foreach_function_impl(impl, shader) {
bool impl_progress = false;
struct exec_list *cf_list = &impl->body;
uint32_t modes = 0;
foreach_list_typed(nir_cf_node, cf_node, node, cf_list)
progress |= lower_make_visible(cf_node, &modes);
uint32_t modes = 0;
foreach_list_typed(nir_cf_node, cf_node, node, cf_list)
impl_progress |= lower_make_visible(cf_node, &modes);
modes = 0;
foreach_list_typed_reverse(nir_cf_node, cf_node, node, cf_list)
progress |= lower_make_available(cf_node, &modes);
modes = 0;
foreach_list_typed_reverse(nir_cf_node, cf_node, node, cf_list)
impl_progress |= lower_make_available(cf_node, &modes);
if (progress)
nir_metadata_preserve(impl, nir_metadata_control_flow);
else
nir_metadata_preserve(impl, nir_metadata_all);
if (impl_progress)
nir_metadata_preserve(impl, nir_metadata_control_flow);
else
nir_metadata_preserve(impl, nir_metadata_all);
progress |= impl_progress;
}
return progress;
}