spirv: run nir_copy_prop before nir_rematerialize_derefs_in_use_blocks_impl

spirv_to_nir sometimes wraps derefs in vec2 or mov instructions as part of
its texture handling. These get in the way of
nir_rematerialize_derefs_in_use_blocks_impl. Running copy propagation
should get rid of the extra move instructions and get us back to intact
deref chains for everything except variable pointer use-cases.

fossil-db (Sienna Cichlid):
Totals from 6 (0.00% of 134572) affected shaders:
CodeSize: 92656 -> 93088 (+0.47%)
Instrs: 17060 -> 17138 (+0.46%)
Latency: 224408 -> 227539 (+1.40%)
InvThroughput: 37402 -> 37924 (+1.40%)
VClause: 408 -> 402 (-1.47%)
Copies: 1065 -> 1107 (+3.94%)

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5668
Fixes: 14a12b771d ("spirv: Rework our handling of images and samplers")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13924>
This commit is contained in:
Rhys Perry 2021-11-23 13:27:14 +00:00 committed by Marge Bot
parent 7fb6eafbc4
commit b425100781
3 changed files with 4 additions and 1 deletions

View File

@ -5557,6 +5557,7 @@ bool nir_opt_combine_memory_barriers(nir_shader *shader,
bool nir_opt_combine_stores(nir_shader *shader, nir_variable_mode modes);
bool nir_copy_prop_impl(nir_function_impl *impl);
bool nir_copy_prop(nir_shader *shader);
bool nir_opt_copy_prop_vars(nir_shader *shader);

View File

@ -162,7 +162,7 @@ copy_prop_instr(nir_function_impl *impl, nir_instr *instr)
return progress;
}
static bool
bool
nir_copy_prop_impl(nir_function_impl *impl)
{
bool progress = false;

View File

@ -1387,6 +1387,8 @@ vtn_function_emit(struct vtn_builder *b, struct vtn_function *func,
vtn_foreach_instruction(b, func->start_block->label, func->end,
vtn_handle_phi_second_pass);
if (func->nir_func->impl->structured)
nir_copy_prop_impl(impl);
nir_rematerialize_derefs_in_use_blocks_impl(impl);
/*