[Mesa-dev] [PATCH 22/47] i965/fs: Add remove_extra_rounding_modes optimization
Alejandro PiƱeiro
apinheiro at igalia.com
Thu Aug 24 13:54:37 UTC 2017
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
More information about the mesa-dev
mailing list