From: Rob Clark Date: Mon, 9 May 2016 16:36:03 +0000 (-0400) Subject: nir: return progress from lower_idiv X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=79d6409a1467127daaea8a98e6d8c14779180a79;p=mesa.git nir: return progress from lower_idiv With algebraic-opt support for lowering div to shift, the driver would like to be able to run this pass *after* the main opt-loop, and then conditionally re-run the opt-loop if this pass actually lowered some- thing. Signed-off-by: Rob Clark Reviewed-by: Kenneth Graunke --- diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index dd919945e02..2227910eae1 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2379,7 +2379,7 @@ typedef struct nir_lower_tex_options { bool nir_lower_tex(nir_shader *shader, const nir_lower_tex_options *options); -void nir_lower_idiv(nir_shader *shader); +bool nir_lower_idiv(nir_shader *shader); void nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables); void nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables); diff --git a/src/compiler/nir/nir_lower_idiv.c b/src/compiler/nir/nir_lower_idiv.c index f2e7cdeb33d..b1e7aeb03c8 100644 --- a/src/compiler/nir/nir_lower_idiv.c +++ b/src/compiler/nir/nir_lower_idiv.c @@ -36,7 +36,7 @@ * branch out to a pre-optimized shader library routine.. */ -static void +static bool convert_instr(nir_builder *bld, nir_alu_instr *alu) { nir_ssa_def *numer, *denom, *af, *bf, *a, *b, *q, *r; @@ -46,7 +46,7 @@ convert_instr(nir_builder *bld, nir_alu_instr *alu) if ((op != nir_op_idiv) && (op != nir_op_udiv) && (op != nir_op_umod)) - return; + return false; is_signed = (op == nir_op_idiv); @@ -115,30 +115,39 @@ convert_instr(nir_builder *bld, nir_alu_instr *alu) assert(alu->dest.dest.is_ssa); nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, nir_src_for_ssa(q)); + + return true; } -static void +static bool convert_impl(nir_function_impl *impl) { nir_builder b; nir_builder_init(&b, impl); + bool progress = false; nir_foreach_block(block, impl) { nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_alu) - convert_instr(&b, nir_instr_as_alu(instr)); + progress |= convert_instr(&b, nir_instr_as_alu(instr)); } } nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); + + return progress; } -void +bool nir_lower_idiv(nir_shader *shader) { + bool progress = false; + nir_foreach_function(function, shader) { if (function->impl) - convert_impl(function->impl); + progress |= convert_impl(function->impl); } + + return progress; }