On Mon, Sep 11, 2017 at 8:00 AM, Jose Maria Casanova Crespo < jmcasan...@igalia.com> wrote:
> From: Alejandro Piñeiro <apinhe...@igalia.com> > > Although from SPIR-V point of view, rounding modes are attached to the > operation/destination, on i965 it is a status, so we don't need to > explicitly set the rounding mode if the one we want is already set. > > Taking into account that the default mode is RTE, one possible > optimization would be optimize out the first RTE set for each > block. For in order to work, we would need to take into account block > interrelationships. At this point, it is not worth to complicate the > optimization for such small gain. > > v2: Use a single SHADER_OPCODE_RND_MODE opcode taking an immediate > with the rounding mode (Curro) > v3: Reset optimization for every block. (Jason Ekstrand) > > Signed-off-by: Jose Maria Casanova Crespo <jmcasan...@igalia.com> > Signed-off-by: Alejandro Piñeiro <apinhe...@igalia.com> > --- > src/intel/compiler/brw_eu_defines.h | 3 ++- > src/intel/compiler/brw_fs.cpp | 37 ++++++++++++++++++++++++++++++ > +++++++ > src/intel/compiler/brw_fs.h | 1 + > 3 files changed, 40 insertions(+), 1 deletion(-) > > diff --git a/src/intel/compiler/brw_eu_defines.h > b/src/intel/compiler/brw_eu_defines.h > index 72f773352e..aea58284bc 100644 > --- a/src/intel/compiler/brw_eu_defines.h > +++ b/src/intel/compiler/brw_eu_defines.h > @@ -1227,7 +1227,8 @@ enum PACKED brw_rnd_mode { > BRW_RND_MODE_RTNE = 0, /* Round to Nearest or Even */ > BRW_RND_MODE_RU = 1, /* Round Up, toward +inf */ > BRW_RND_MODE_RD = 2, /* Round Down, toward -inf */ > - BRW_RND_MODE_RTZ = 3 /* Round Toward Zero */ > + BRW_RND_MODE_RTZ = 3, /* Round Toward Zero */ > + BRW_RND_MODE_UNSPECIFIED /* Unspecified rounding mode */ > In the future, please end enum lists with commas. The C grammar allows it and it means you don't have an extra +- line if you add an entry to the end. Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> > }; > > #endif /* BRW_EU_DEFINES_H */ > diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp > index 45236e3cab..9b33a32917 100644 > --- a/src/intel/compiler/brw_fs.cpp > +++ b/src/intel/compiler/brw_fs.cpp > @@ -3071,6 +3071,42 @@ fs_visitor::remove_duplicate_mrf_writes() > return progress; > } > > +/** > + * Rounding modes for conversion instructions are included for each > + * conversion, but right now it is a state. So once it is set, > + * we don't need to call it again for subsequent calls. > + * > + * This is useful for vector/matrices conversions, as setting the > + * mode once is enough for the full vector/matrix > + */ > +bool > +fs_visitor::remove_extra_rounding_modes() > +{ > + bool progress = false; > + > + foreach_block (block, cfg) { > + brw_rnd_mode prev_mode = BRW_RND_MODE_UNSPECIFIED; > + > + foreach_inst_in_block_safe (fs_inst, inst, block) { > + if (inst->opcode == SHADER_OPCODE_RND_MODE) { > + assert(inst->src[0].file == BRW_IMMEDIATE_VALUE); > + const brw_rnd_mode mode = (brw_rnd_mode) inst->src[0].d; > + if (mode == prev_mode) { > + inst->remove(block); > + progress = true; > + } else { > + prev_mode = mode; > + } > + } > + } > + } > + > + if (progress) > + invalidate_live_intervals(); > + > + return progress; > +} > + > static void > clear_deps_for_inst_src(fs_inst *inst, bool *deps, int first_grf, int > grf_len) > { > @@ -5748,6 +5784,7 @@ fs_visitor::optimize() > int pass_num = 0; > > OPT(opt_drop_redundant_mov_to_flags); > + OPT(remove_extra_rounding_modes); > > do { > progress = false; > diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h > index f1ba193de7..b9476e69ed 100644 > --- a/src/intel/compiler/brw_fs.h > +++ b/src/intel/compiler/brw_fs.h > @@ -150,6 +150,7 @@ public: > bool eliminate_find_live_channel(); > bool dead_code_eliminate(); > bool remove_duplicate_mrf_writes(); > + bool remove_extra_rounding_modes(); > > bool opt_sampler_eot(); > bool virtual_grf_interferes(int a, int b); > -- > 2.13.5 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev