i965/fs: Remove logic to keep track of MRF metadata in lower_load_payload().
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 4 Feb 2015 17:49:32 +0000 (19:49 +0200)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 23 Feb 2015 18:55:40 +0000 (20:55 +0200)
MRFs cannot be read from anyway so they cannot possibly be a valid
source of LOAD_PAYLOAD.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_fs.cpp

index 62a5639fa0a36ac27aac3c8ef9002dd1d1cd7779..e396fbc08256fe2685ace46ed3abc22efed78a65 100644 (file)
@@ -3112,7 +3112,7 @@ fs_visitor::lower_load_payload()
    bool progress = false;
 
    int vgrf_to_reg[alloc.count];
-   int reg_count = 16; /* Leave room for MRF */
+   int reg_count = 0;
    for (unsigned i = 0; i < alloc.count; ++i) {
       vgrf_to_reg[i] = reg_count;
       reg_count += alloc.sizes[i];
@@ -3126,15 +3126,8 @@ fs_visitor::lower_load_payload()
    memset(metadata, 0, sizeof(metadata));
 
    foreach_block_and_inst_safe (block, fs_inst, inst, cfg) {
-      int dst_reg;
       if (inst->dst.file == GRF) {
-         dst_reg = vgrf_to_reg[inst->dst.reg];
-      } else {
-         /* MRF */
-         dst_reg = inst->dst.reg;
-      }
-
-      if (inst->dst.file == MRF || inst->dst.file == GRF) {
+         const int dst_reg = vgrf_to_reg[inst->dst.reg];
          bool force_sechalf = inst->force_sechalf &&
                               !inst->force_writemask_all;
          bool toggle_sechalf = inst->dst.width == 16 &&
@@ -3180,26 +3173,20 @@ fs_visitor::lower_load_payload()
                                 inst->src[i].reg_offset;
                   mov->force_sechalf = metadata[src_reg].force_sechalf;
                   mov->force_writemask_all = metadata[src_reg].force_writemask_all;
-                  metadata[dst_reg] = metadata[src_reg];
+               }
+
+               if (dst.file == GRF) {
+                  const int dst_reg = vgrf_to_reg[dst.reg];
+                  const bool force_writemask = mov->force_writemask_all;
+                  metadata[dst_reg].force_writemask_all = force_writemask;
+                  metadata[dst_reg].force_sechalf = mov->force_sechalf;
                   if (dst.width * type_sz(dst.type) > 32) {
-                     if (metadata[src_reg].force_writemask_all) {
-                        metadata[dst_reg + 1] = metadata[src_reg];
-                     } else {
-                        assert((!metadata[src_reg].written ||
-                                !metadata[src_reg].force_sechalf) &&
-                               (!metadata[src_reg + 1].written ||
-                                metadata[src_reg + 1].force_sechalf));
-                        metadata[dst_reg + 1] = metadata[src_reg + 1];
-                     }
-                  }
-               } else {
-                  metadata[dst_reg].force_writemask_all = false;
-                  metadata[dst_reg].force_sechalf = false;
-                  if (dst.width == 16) {
-                     metadata[dst_reg + 1].force_writemask_all = false;
-                     metadata[dst_reg + 1].force_sechalf = true;
+                     assert(!mov->force_sechalf);
+                     metadata[dst_reg + 1].force_writemask_all = force_writemask;
+                     metadata[dst_reg + 1].force_sechalf = !force_writemask;
                   }
                }
+
                inst->insert_before(block, mov);
             }