nir/loop_analyze: delay instruction cost calculation

Here we move the calculation of the instruction cost of the loop
after we have processed other information such as finding the
induction variables. This is useful because we can use this further
information to find instructions that will be eliminated if the
loop was to unroll and therefore give them a cost of 0.

Acked-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18587>
This commit is contained in:
Timothy Arceri
2022-09-14 10:18:05 +10:00
committed by Marge Bot
parent 8b9a5adf8b
commit 13d0ae593b

View File

@@ -208,15 +208,13 @@ instr_cost(nir_instr *instr, const nir_shader_compiler_options *options)
static bool
init_loop_block(nir_block *block, loop_info_state *state,
bool in_if_branch, bool in_nested_loop,
const nir_shader_compiler_options *options)
bool in_if_branch, bool in_nested_loop)
{
init_loop_state init_state = {.in_if_branch = in_if_branch,
.in_nested_loop = in_nested_loop,
.state = state };
nir_foreach_instr(instr, block) {
state->loop->info->instr_cost += instr_cost(instr, options);
nir_foreach_ssa_def(instr, init_loop_def, &init_state);
}
@@ -1299,18 +1297,17 @@ get_loop_info(loop_info_state *state, nir_function_impl *impl)
switch (node->type) {
case nir_cf_node_block:
init_loop_block(nir_cf_node_as_block(node), state,
false, false, options);
init_loop_block(nir_cf_node_as_block(node), state, false, false);
break;
case nir_cf_node_if:
nir_foreach_block_in_cf_node(block, node)
init_loop_block(block, state, true, false, options);
init_loop_block(block, state, true, false);
break;
case nir_cf_node_loop:
nir_foreach_block_in_cf_node(block, node) {
init_loop_block(block, state, false, true, options);
init_loop_block(block, state, false, true);
}
break;
@@ -1343,9 +1340,15 @@ get_loop_info(loop_info_state *state, nir_function_impl *impl)
find_trip_count(state, impl->function->shader->info.float_controls_execution_mode);
nir_foreach_block_in_cf_node(block, &state->loop->cf_node) {
nir_foreach_instr(instr, block) {
state->loop->info->instr_cost += instr_cost(instr, options);
}
if (state->loop->info->force_unroll)
continue;
if (force_unroll_heuristics(state, block)) {
state->loop->info->force_unroll = true;
break;
}
}
}