From b8cafaa91dfd792c8aca8e5d633b23a86830de7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20=C5=9Alusarz?= Date: Tue, 10 Aug 2021 14:44:22 +0200 Subject: [PATCH] lima: use nir_shader_instructions_pass in lima_nir_split_load_input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes: - nir_metadata_preserve(..., nir_metadata_block_index | nir_metadata_dominance) is called only when pass makes progress - nir_metadata_preserve(..., nir_metadata_all) is called when pass doesn't make progress Signed-off-by: Marcin Ĺšlusarz Reviewed-by: Vasily Khoruzhick Part-of: --- .../lima/ir/lima_nir_split_load_input.c | 135 +++++++----------- 1 file changed, 55 insertions(+), 80 deletions(-) diff --git a/src/gallium/drivers/lima/ir/lima_nir_split_load_input.c b/src/gallium/drivers/lima/ir/lima_nir_split_load_input.c index 5037896cdf4..4cd37bdd243 100644 --- a/src/gallium/drivers/lima/ir/lima_nir_split_load_input.c +++ b/src/gallium/drivers/lima/ir/lima_nir_split_load_input.c @@ -27,91 +27,71 @@ #include "lima_ir.h" static bool -lima_nir_split_load_input_block(nir_block *block, nir_builder *b) +lima_nir_split_load_input_instr(nir_builder *b, + nir_instr *instr, + UNUSED void *cb_data) { - bool progress = false; + if (instr->type != nir_instr_type_alu) + return false; - nir_foreach_instr_safe(instr, block) { - if (instr->type != nir_instr_type_alu) - continue; + nir_alu_instr *alu = nir_instr_as_alu(instr); + if (alu->op != nir_op_mov) + return false; - nir_alu_instr *alu = nir_instr_as_alu(instr); - if (alu->op != nir_op_mov) - continue; + if (!alu->dest.dest.is_ssa) + return false; - if (!alu->dest.dest.is_ssa) - continue; + if (!alu->src[0].src.is_ssa) + return false; - if (!alu->src[0].src.is_ssa) - continue; + nir_ssa_def *ssa = alu->src[0].src.ssa; + if (ssa->parent_instr->type != nir_instr_type_intrinsic) + return false; - nir_ssa_def *ssa = alu->src[0].src.ssa; - if (ssa->parent_instr->type != nir_instr_type_intrinsic) - continue; + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(ssa->parent_instr); + if (intrin->intrinsic != nir_intrinsic_load_input) + return false; - nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(ssa->parent_instr); - if (intrin->intrinsic != nir_intrinsic_load_input) - continue; + uint8_t swizzle = alu->src[0].swizzle[0]; + int i; - uint8_t swizzle = alu->src[0].swizzle[0]; - int i; + for (i = 1; i < nir_dest_num_components(alu->dest.dest); i++) + if (alu->src[0].swizzle[i] != (swizzle + i)) + break; - for (i = 1; i < nir_dest_num_components(alu->dest.dest); i++) - if (alu->src[0].swizzle[i] != (swizzle + i)) - break; + if (i != nir_dest_num_components(alu->dest.dest)) + return false; - if (i != nir_dest_num_components(alu->dest.dest)) - continue; + /* mali4xx can't access unaligned vec3, don't split load input */ + if (nir_dest_num_components(alu->dest.dest) == 3 && swizzle > 0) + return false; - /* mali4xx can't access unaligned vec3, don't split load input */ - if (nir_dest_num_components(alu->dest.dest) == 3 && swizzle > 0) - continue; + /* mali4xx can't access unaligned vec2, don't split load input */ + if (nir_dest_num_components(alu->dest.dest) == 2 && + swizzle != 0 && swizzle != 2) + return false; - /* mali4xx can't access unaligned vec2, don't split load input */ - if (nir_dest_num_components(alu->dest.dest) == 2 && - swizzle != 0 && swizzle != 2) - continue; + b->cursor = nir_before_instr(&intrin->instr); + nir_intrinsic_instr *new_intrin = nir_intrinsic_instr_create( + b->shader, + intrin->intrinsic); + nir_ssa_dest_init(&new_intrin->instr, &new_intrin->dest, + nir_dest_num_components(alu->dest.dest), + ssa->bit_size, + NULL); + new_intrin->num_components = nir_dest_num_components(alu->dest.dest); + nir_intrinsic_set_base(new_intrin, nir_intrinsic_base(intrin)); + nir_intrinsic_set_component(new_intrin, nir_intrinsic_component(intrin) + swizzle); + nir_intrinsic_set_dest_type(new_intrin, nir_intrinsic_dest_type(intrin)); - b->cursor = nir_before_instr(&intrin->instr); - nir_intrinsic_instr *new_intrin = nir_intrinsic_instr_create( - b->shader, - intrin->intrinsic); - nir_ssa_dest_init(&new_intrin->instr, &new_intrin->dest, - nir_dest_num_components(alu->dest.dest), - ssa->bit_size, - NULL); - new_intrin->num_components = nir_dest_num_components(alu->dest.dest); - nir_intrinsic_set_base(new_intrin, nir_intrinsic_base(intrin)); - nir_intrinsic_set_component(new_intrin, nir_intrinsic_component(intrin) + swizzle); - nir_intrinsic_set_dest_type(new_intrin, nir_intrinsic_dest_type(intrin)); + /* offset */ + nir_src_copy(&new_intrin->src[0], &intrin->src[0]); - /* offset */ - nir_src_copy(&new_intrin->src[0], &intrin->src[0]); - - nir_builder_instr_insert(b, &new_intrin->instr); - nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, - &new_intrin->dest.ssa); - nir_instr_remove(&alu->instr); - progress = true; - } - - return progress; -} - -static bool -lima_nir_split_load_input_impl(nir_function_impl *impl) -{ - bool progress = false; - nir_builder builder; - nir_builder_init(&builder, impl); - - nir_foreach_block(block, impl) { - progress |= lima_nir_split_load_input_block(block, &builder); - } - - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - return progress; + nir_builder_instr_insert(b, &new_intrin->instr); + nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, + &new_intrin->dest.ssa); + nir_instr_remove(&alu->instr); + return true; } /* Replaces a single load of several packed varyings and number of movs with @@ -120,13 +100,8 @@ lima_nir_split_load_input_impl(nir_function_impl *impl) bool lima_nir_split_load_input(nir_shader *shader) { - bool progress = false; - - nir_foreach_function(function, shader) { - if (function->impl) - progress |= lima_nir_split_load_input_impl(function->impl); - } - - return progress; + return nir_shader_instructions_pass(shader, lima_nir_split_load_input_instr, + nir_metadata_block_index | + nir_metadata_dominance, + NULL); } -