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. --- src/intel/compiler/brw_fs.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/intel/compiler/brw_fs.h | 1 + 2 files changed, 43 insertions(+)
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 6740e01ea52..c4c26456330 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -3070,6 +3070,47 @@ 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; + /* By default, the rounding mode is rte, so we can consider it as the + * starting rounding mode + */ + brw_rnd_mode prev_mode = BRW_RND_MODE_RTE; + brw_rnd_mode current_mode; + + foreach_block_and_inst_safe (block, fs_inst, inst, cfg) { + if (inst->opcode == SHADER_OPCODE_RND_MODE_RTZ || + inst->opcode == SHADER_OPCODE_RND_MODE_RTE) { + + current_mode = (inst->opcode == SHADER_OPCODE_RND_MODE_RTZ) ? + BRW_RND_MODE_RTZ : BRW_RND_MODE_RTE; + + if (current_mode == prev_mode) { + inst->remove(block); + progress = true; + } else { + prev_mode = current_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) { @@ -5747,6 +5788,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 f1ba193de7e..b9476e69edb 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.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev