From: Afonso Bordado Date: Fri, 27 Dec 2019 17:09:51 +0000 (+0000) Subject: pan/midgard: Optimize branches with inverted arguments X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=525cbe85ef522902d9e14ddc5a4b17f91f2ebea2;p=mesa.git pan/midgard: Optimize branches with inverted arguments Remove the invert on arguments to branches, and invert the branch condition instead. This saves one instruction per inverted argument. Closes #2088 Signed-off-by: Afonso Bordado Reviewed-by: Alyssa Rosenzweig --- diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index 85b7a87405e..024aaf93f64 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -705,5 +705,6 @@ bool midgard_opt_fuse_dest_invert(compiler_context *ctx, midgard_block *block); bool midgard_opt_csel_invert(compiler_context *ctx, midgard_block *block); bool midgard_opt_promote_fmov(compiler_context *ctx, midgard_block *block); bool midgard_opt_drop_cmp_invert(compiler_context *ctx, midgard_block *block); +bool midgard_opt_invert_branch(compiler_context *ctx, midgard_block *block); #endif diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index b57291dad05..306d63374b1 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -2679,6 +2679,7 @@ midgard_compile_shader_nir(nir_shader *nir, midgard_program *program, bool is_bl progress |= midgard_opt_fuse_dest_invert(ctx, block); progress |= midgard_opt_csel_invert(ctx, block); progress |= midgard_opt_drop_cmp_invert(ctx, block); + progress |= midgard_opt_invert_branch(ctx, block); } } while (progress); diff --git a/src/panfrost/midgard/midgard_opt_invert.c b/src/panfrost/midgard/midgard_opt_invert.c index 4527102553b..e11e4c0fdec 100644 --- a/src/panfrost/midgard/midgard_opt_invert.c +++ b/src/panfrost/midgard/midgard_opt_invert.c @@ -375,3 +375,27 @@ midgard_opt_drop_cmp_invert(compiler_context *ctx, midgard_block *block) return progress; } + +/* Optimizes branches with inverted arguments by inverting the + * branch condition instead of the argument condition. + */ +bool +midgard_opt_invert_branch(compiler_context *ctx, midgard_block *block) +{ + bool progress = false; + + mir_foreach_instr_in_block_safe(block, ins) { + if (ins->type != TAG_ALU_4) continue; + if (!midgard_is_branch_unit(ins->unit)) continue; + if (!ins->branch.conditional) continue; + if (ins->src[0] & IS_REG) continue; + + if (mir_strip_inverted(ctx, ins->src[0])) { + ins->branch.invert_conditional = !ins->branch.invert_conditional; + + progress |= true; + } + } + + return progress; +}