diff options
author | Kenneth Graunke <[email protected]> | 2016-04-20 01:42:25 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2016-05-05 14:24:00 -0700 |
commit | c7a8b3270058a8831ee811494f722d278074b0f1 (patch) | |
tree | d4b3080546471d1b45422ee9f6f25a8e2919bf77 /src | |
parent | 49ea7454a189d9ebfa03fddfdba9949c6eaf4caa (diff) |
nir: Replace vecN(undef, undef, ...) with a single undef.
shader-db statistics on Broadwell:
total instructions in shared programs: 8963409 -> 8962455 (-0.01%)
instructions in affected programs: 60858 -> 59904 (-1.57%)
helped: 318
HURT: 0
total cycles in shared programs: 71408022 -> 71406276 (-0.00%)
cycles in affected programs: 398416 -> 396670 (-0.44%)
helped: 199
HURT: 51
GAINED: 1
The only shaders affected were in Dota 2 Reborn.
It also sets up for the next optimization.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir_opt_undef.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_undef.c b/src/compiler/nir/nir_opt_undef.c index ce18c2df043..a7bb887353e 100644 --- a/src/compiler/nir/nir_opt_undef.c +++ b/src/compiler/nir/nir_opt_undef.c @@ -22,6 +22,7 @@ */ #include "nir.h" +#include "nir_builder.h" /** @file nir_opt_undef.c * @@ -70,19 +71,51 @@ opt_undef_csel(nir_alu_instr *instr) return false; } +/** + * Replace vecN(undef, undef, ...) with a single undef. + */ +static bool +opt_undef_vecN(nir_builder *b, nir_alu_instr *alu) +{ + if (alu->op != nir_op_vec2 && + alu->op != nir_op_vec3 && + alu->op != nir_op_vec4) + return false; + + assert(alu->dest.dest.is_ssa); + + unsigned num_components = nir_op_infos[alu->op].num_inputs; + + for (unsigned i = 0; i < num_components; i++) { + if (!alu->src[i].src.is_ssa || + alu->src[i].src.ssa->parent_instr->type != nir_instr_type_ssa_undef) + return false; + } + + b->cursor = nir_before_instr(&alu->instr); + nir_ssa_def *undef = + nir_ssa_undef(b, num_components, nir_dest_bit_size(alu->dest.dest)); + nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa, nir_src_for_ssa(undef)); + + return true; +} + bool nir_opt_undef(nir_shader *shader) { + nir_builder b; bool progress = false; nir_foreach_function(function, shader) { if (function->impl) { + nir_builder_init(&b, function->impl); nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_alu) { nir_alu_instr *alu = nir_instr_as_alu(instr); progress = opt_undef_csel(alu) || progress; + progress = opt_undef_vecN(&b, alu) || progress; } } } |