diff options
author | Afonso Bordado <[email protected]> | 2019-12-27 17:09:51 +0000 |
---|---|---|
committer | Afonso Bordado <[email protected]> | 2019-12-31 20:01:16 +0000 |
commit | 525cbe85ef522902d9e14ddc5a4b17f91f2ebea2 (patch) | |
tree | 8b33dda792d75f4abbf1ea1cdc24c03350560bd3 | |
parent | 0e83688f477a2e98f94f342cd9a637a9f140a69d (diff) |
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 <[email protected]>
Reviewed-by: Alyssa Rosenzweig <[email protected]>
-rw-r--r-- | src/panfrost/midgard/compiler.h | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_compile.c | 1 | ||||
-rw-r--r-- | src/panfrost/midgard/midgard_opt_invert.c | 24 |
3 files changed, 26 insertions, 0 deletions
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; +} |