[Mesa-dev] [PATCH 04/13] i965/fs_inst: Add an is_copy_payload helper

Jason Ekstrand jason at jlekstrand.net
Wed Apr 1 18:19:15 PDT 2015


This allows us to combine code in CSE and register coalesce
---
 src/mesa/drivers/dri/i965/brw_fs.cpp                   | 14 ++++++++++++++
 src/mesa/drivers/dri/i965/brw_fs_cse.cpp               | 18 +-----------------
 src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp | 14 +-------------
 src/mesa/drivers/dri/i965/brw_ir_fs.h                  |  1 +
 4 files changed, 17 insertions(+), 30 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 852abbe..4c29cf1 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -517,6 +517,20 @@ fs_inst::is_send_from_grf() const
 }
 
 bool
+fs_inst::is_copy_payload() const
+{
+   fs_reg reg = this->src[0];
+   if (reg.file != GRF || reg.reg_offset != 0 || reg.stride == 0)
+      return false;
+
+   for (int i = 1; i < this->sources; i++)
+      if (!this->src[i].equals(::offset(reg, i)))
+         return false;
+
+   return true;
+}
+
+bool
 fs_inst::can_do_source_mods(struct brw_context *brw)
 {
    if (brw->gen == 6 && is_math())
diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
index 61837d2..a8aeebf 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp
@@ -43,22 +43,6 @@ struct aeb_entry : public exec_node {
 }
 
 static bool
-is_copy_payload(const fs_inst *inst)
-{
-   const int reg = inst->src[0].reg;
-   if (inst->src[0].reg_offset != 0)
-      return false;
-
-   for (int i = 1; i < inst->sources; i++) {
-      if (inst->src[i].reg != reg ||
-          inst->src[i].reg_offset != i) {
-         return false;
-      }
-   }
-   return true;
-}
-
-static bool
 is_expression(const fs_inst *const inst)
 {
    switch (inst->opcode) {
@@ -102,7 +86,7 @@ is_expression(const fs_inst *const inst)
    case SHADER_OPCODE_COS:
       return inst->mlen < 2;
    case SHADER_OPCODE_LOAD_PAYLOAD:
-      return !is_copy_payload(inst);
+      return !inst->is_copy_payload();
    default:
       return inst->is_send_from_grf() && !inst->has_side_effects();
    }
diff --git a/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp b/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp
index e3cf2db..884acec 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_register_coalesce.cpp
@@ -64,18 +64,6 @@ is_nop_mov(const fs_inst *inst)
 }
 
 static bool
-is_copy_payload(const fs_inst *inst)
-{
-   fs_reg reg = inst->src[0];
-
-   for (int i = 0; i < inst->sources; i++)
-      if (!inst->src[i].equals(offset(reg, i)))
-         return false;
-
-   return true;
-}
-
-static bool
 is_coalesce_candidate(const fs_visitor *v, const fs_inst *inst)
 {
    if ((inst->opcode != BRW_OPCODE_MOV &&
@@ -99,7 +87,7 @@ is_coalesce_candidate(const fs_visitor *v, const fs_inst *inst)
       if (v->alloc.sizes[inst->src[0].reg] != inst->regs_written)
          return false;
 
-      if (!is_copy_payload(inst)) {
+      if (!inst->is_copy_payload()) {
          return false;
       }
    }
diff --git a/src/mesa/drivers/dri/i965/brw_ir_fs.h b/src/mesa/drivers/dri/i965/brw_ir_fs.h
index 9ef1261..c4f5540 100644
--- a/src/mesa/drivers/dri/i965/brw_ir_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_ir_fs.h
@@ -223,6 +223,7 @@ public:
    bool overwrites_reg(const fs_reg &reg) const;
    bool is_send_from_grf() const;
    bool is_partial_write() const;
+   bool is_copy_payload() const;
    int regs_read(int arg) const;
    bool can_do_source_mods(struct brw_context *brw);
 
-- 
2.3.4



More information about the mesa-dev mailing list