diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 4bc575d73b0..71c7f028f06 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -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 diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index 1340f6678bb..3c340d0e27f 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -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: diff --git a/src/compiler/nir/nir_lower_memory_model.c b/src/compiler/nir/nir_lower_memory_model.c index 95d9f4e9526..c797eae8a4e 100644 --- a/src/compiler/nir/nir_lower_memory_model.c +++ b/src/compiler/nir/nir_lower_memory_model.c @@ -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; }