OSDN Git Service

i965/fs: Copy propagate from load_payload.
authorMatt Turner <mattst88@gmail.com>
Thu, 17 Apr 2014 22:13:00 +0000 (15:13 -0700)
committerMatt Turner <mattst88@gmail.com>
Tue, 17 Jun 2014 16:40:30 +0000 (09:40 -0700)
But only into non-load_payload instructions. Otherwise we would prevent
register coalescing from combining identical payloads.

src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index 158d0ba..cc6e86f 100644 (file)
@@ -42,6 +42,7 @@ namespace { /* avoid conflict with opt_copy_propagation_elements */
 struct acp_entry : public exec_node {
    fs_reg dst;
    fs_reg src;
+   enum opcode opcode;
 };
 
 struct block_data {
@@ -287,6 +288,10 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
    if (entry->src.file == IMM)
       return false;
 
+   if (entry->opcode == SHADER_OPCODE_LOAD_PAYLOAD &&
+       inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD)
+      return false;
+
    /* Bail if inst is reading more than entry is writing. */
    if ((inst->regs_read(this, arg) * inst->src[arg].stride *
         type_sz(inst->src[arg].type)) > type_sz(entry->dst.type))
@@ -569,7 +574,24 @@ fs_visitor::opt_copy_propagate_local(void *copy_prop_ctx, bblock_t *block,
         acp_entry *entry = ralloc(copy_prop_ctx, acp_entry);
         entry->dst = inst->dst;
         entry->src = inst->src[0];
+         entry->opcode = inst->opcode;
         acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry);
+      } else if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD &&
+                 inst->dst.file == GRF) {
+         for (int i = 0; i < inst->sources; i++) {
+            if (inst->src[i].file == GRF) {
+               acp_entry *entry = ralloc(copy_prop_ctx, acp_entry);
+               entry->dst = inst->dst;
+               entry->dst.reg_offset = i;
+               entry->src = inst->src[i];
+               entry->opcode = inst->opcode;
+               if (!entry->dst.equals(inst->src[i])) {
+                  acp[entry->dst.reg % ACP_HASH_SIZE].push_tail(entry);
+               } else {
+                  ralloc_free(entry);
+               }
+            }
+         }
       }
    }