Mesa (master): i965/fs: Factor def[]/use[] setup out to a separate function .

Eric Anholt anholt at kemper.freedesktop.org
Thu Oct 10 23:30:15 UTC 2013


Module: Mesa
Branch: master
Commit: 097bf101c33ee14e4e163523dc4e4e0fbca9f051
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=097bf101c33ee14e4e163523dc4e4e0fbca9f051

Author: Eric Anholt <eric at anholt.net>
Date:   Fri Apr  5 14:20:43 2013 -0700

i965/fs: Factor def[]/use[] setup out to a separate function.

These blocks are about to grow some more code, and the indentation was
getting out of hand.

v2 (Kenneth Graunke): Rebase, minor typo fixes and style changes.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 .../drivers/dri/i965/brw_fs_live_variables.cpp     |   57 ++++++++++++++------
 src/mesa/drivers/dri/i965/brw_fs_live_variables.h  |    2 +
 2 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
index 099eeaa..57b4d24 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.cpp
@@ -50,6 +50,35 @@ using namespace brw;
  * 14.1 (p444).
  */
 
+void
+fs_live_variables::setup_one_read(bblock_t *block, fs_inst *inst,
+                                  int ip, fs_reg reg)
+{
+   int var = var_from_vgrf[reg.reg] + reg.reg_offset;
+
+   /* The use[] bitset marks when the block makes use of a variable (VGRF
+    * channel) without having completely defined that variable within the
+    * block.
+    */
+   if (!BITSET_TEST(bd[block->block_num].def, var))
+      BITSET_SET(bd[block->block_num].use, var);
+}
+
+void
+fs_live_variables::setup_one_write(bblock_t *block, fs_inst *inst,
+                                   int ip, fs_reg reg)
+{
+   int var = var_from_vgrf[reg.reg] + reg.reg_offset;
+
+   /* The def[] bitset marks when an initialization in a block completely
+    * screens off previous updates of that variable (VGRF channel).
+    */
+   if (inst->dst.file == GRF && !inst->is_partial_write()) {
+      if (!BITSET_TEST(bd[block->block_num].use, var))
+         BITSET_SET(bd[block->block_num].def, var);
+   }
+}
+
 /**
  * Sets up the use[] and def[] bitsets.
  *
@@ -77,7 +106,9 @@ fs_live_variables::setup_def_use()
 
 	 /* Set use[] for this instruction */
 	 for (unsigned int i = 0; i < 3; i++) {
-	    if (inst->src[i].file != GRF)
+            fs_reg reg = inst->src[i];
+
+            if (reg.file != GRF)
                continue;
 
             int regs_read = 1;
@@ -85,26 +116,20 @@ fs_live_variables::setup_def_use()
              * so just assume "all of them."
              */
             if (inst->is_send_from_grf())
-               regs_read = v->virtual_grf_sizes[inst->src[i].reg];
-
-            for (int j = 0; j < regs_read; j++) {
-               int var = var_from_vgrf[inst->src[i].reg] +
-                         inst->src[i].reg_offset + j;
+               regs_read = v->virtual_grf_sizes[reg.reg];
 
-               if (!BITSET_TEST(bd[b].def, var))
-                  BITSET_SET(bd[b].use, var);
+            for (int i = 0; i < regs_read; i++) {
+               setup_one_read(block, inst, ip, reg);
+               reg.reg_offset++;
             }
 	 }
 
-	 /* Check for unconditional writes to whole registers. These
-	  * are the things that screen off preceding definitions of a
-	  * variable, and thus qualify for being in def[].
-	  */
-	 if (inst->dst.file == GRF && !inst->is_partial_write()) {
-            int var = var_from_vgrf[inst->dst.reg] + inst->dst.reg_offset;
+         /* Set def[] for this instruction */
+         if (inst->dst.file == GRF) {
+            fs_reg reg = inst->dst;
             for (int j = 0; j < inst->regs_written; j++) {
-               if (!BITSET_TEST(bd[b].use, var + j))
-                  BITSET_SET(bd[b].def, var + j);
+               setup_one_write(block, inst, ip, reg);
+               reg.reg_offset++;
             }
 	 }
 
diff --git a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
index ab612cc..a2abde2 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
+++ b/src/mesa/drivers/dri/i965/brw_fs_live_variables.h
@@ -59,6 +59,8 @@ public:
    ~fs_live_variables();
 
    void setup_def_use();
+   void setup_one_read(bblock_t *block, fs_inst *inst, int ip, fs_reg reg);
+   void setup_one_write(bblock_t *block, fs_inst *inst, int ip, fs_reg reg);
    void compute_live_variables();
 
    fs_visitor *v;




More information about the mesa-commit mailing list