[Mesa-dev] [PATCH v2 15/20] i965/vec4: consider subregister offset in live variables

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Jan 17 09:49:29 UTC 2017


From: "Juan A. Suarez Romero" <jasuarez at igalia.com>

Take in account the offset value when getting the var from register.

This is required when dealing with an operation that writes half of the
register (like one d2x in IVB/BYT, which uses exec_size == 4).

Note that for live analysis variables we need to stick to per-GRF
analysis. In this case, we use var_from_reg() with GRF precision.
---
 src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp | 12 ++++++++----
 src/mesa/drivers/dri/i965/brw_vec4_live_variables.h   | 10 ++++++----
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp b/src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp
index 73f658cd8fa..54ebd0994ee 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_live_variables.cpp
@@ -78,7 +78,8 @@ vec4_live_variables::setup_def_use()
 	    if (inst->src[i].file == VGRF) {
                for (unsigned j = 0; j < DIV_ROUND_UP(inst->size_read(i), 16); j++) {
                   for (int c = 0; c < 4; c++) {
-                     const unsigned v = var_from_reg(alloc, inst->src[i], c, j);
+                     const unsigned v =
+                        var_from_reg(alloc, inst->src[i], c, j, false);
                      if (!BITSET_TEST(bd->def, v))
                         BITSET_SET(bd->use, v);
                   }
@@ -101,7 +102,8 @@ vec4_live_variables::setup_def_use()
             for (unsigned i = 0; i < DIV_ROUND_UP(inst->size_written, 16); i++) {
                for (int c = 0; c < 4; c++) {
                   if (inst->dst.writemask & (1 << c)) {
-                     const unsigned v = var_from_reg(alloc, inst->dst, c, i);
+                     const unsigned v =
+                        var_from_reg(alloc, inst->dst, c, i, false);
                      if (!BITSET_TEST(bd->use, v))
                         BITSET_SET(bd->def, v);
                   }
@@ -257,7 +259,8 @@ vec4_visitor::calculate_live_intervals()
 	 if (inst->src[i].file == VGRF) {
             for (unsigned j = 0; j < DIV_ROUND_UP(inst->size_read(i), 16); j++) {
                for (int c = 0; c < 4; c++) {
-                  const unsigned v = var_from_reg(alloc, inst->src[i], c, j);
+                  const unsigned v =
+                     var_from_reg(alloc, inst->src[i], c, j, false);
                   start[v] = MIN2(start[v], ip);
                   end[v] = ip;
                }
@@ -269,7 +272,8 @@ vec4_visitor::calculate_live_intervals()
          for (unsigned i = 0; i < DIV_ROUND_UP(inst->size_written, 16); i++) {
             for (int c = 0; c < 4; c++) {
                if (inst->dst.writemask & (1 << c)) {
-                  const unsigned v = var_from_reg(alloc, inst->dst, c, i);
+                  const unsigned v =
+                     var_from_reg(alloc, inst->dst, c, i, false);
                   start[v] = MIN2(start[v], ip);
                   end[v] = ip;
                }
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_live_variables.h b/src/mesa/drivers/dri/i965/brw_vec4_live_variables.h
index 8807c453743..9c505d15f1f 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_live_variables.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4_live_variables.h
@@ -83,13 +83,14 @@ protected:
  */
 inline unsigned
 var_from_reg(const simple_allocator &alloc, const src_reg &reg,
-             unsigned c = 0, unsigned k = 0)
+             unsigned c = 0, unsigned k = 0, bool subreg_precision = true)
 {
    assert(reg.file == VGRF && reg.nr < alloc.count && c < 4);
    const unsigned csize = DIV_ROUND_UP(type_sz(reg.type), 4);
    unsigned result =
       8 * (alloc.offsets[reg.nr] + reg.offset / REG_SIZE) +
-      (BRW_GET_SWZ(reg.swizzle, c) + k / csize * 4) * csize + k % csize;
+      (BRW_GET_SWZ(reg.swizzle, c) + k / csize * 4) * csize + k % csize +
+      (subreg_precision ? (reg.offset % REG_SIZE) / type_sz(reg.type) : 0);
    /* Do not exceed the limit for this register */
    assert(result < 8 * (alloc.offsets[reg.nr] + alloc.sizes[reg.nr]));
    return result;
@@ -97,13 +98,14 @@ var_from_reg(const simple_allocator &alloc, const src_reg &reg,
 
 inline unsigned
 var_from_reg(const simple_allocator &alloc, const dst_reg &reg,
-             unsigned c = 0, unsigned k = 0)
+             unsigned c = 0, unsigned k = 0, bool subreg_precision = true)
 {
    assert(reg.file == VGRF && reg.nr < alloc.count && c < 4);
    const unsigned csize = DIV_ROUND_UP(type_sz(reg.type), 4);
    unsigned result =
       8 * (alloc.offsets[reg.nr] + reg.offset / REG_SIZE) +
-      (c + k / csize * 4) * csize + k % csize;
+      (c + k / csize * 4) * csize + k % csize +
+      (subreg_precision ? (reg.offset % REG_SIZE) / type_sz(reg.type) : 0);
    /* Do not exceed the limit for this register */
    assert(result < 8 * (alloc.offsets[reg.nr] + alloc.sizes[reg.nr]));
    return result;
-- 
2.11.0



More information about the mesa-dev mailing list