i965/fs: Move copy propagation test out to a separate function.
authorEric Anholt <eric@anholt.net>
Wed, 6 Jun 2012 17:57:54 +0000 (10:57 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 3 Jul 2012 19:55:47 +0000 (12:55 -0700)
It's going to get more complicated in a moment.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp

index ee067321f5bfd042ed80ac86604c36ef4bad11fd..507a63751fa72eeaac92c114ef17127e95d1c9f0 100644 (file)
@@ -50,6 +50,9 @@ extern "C" {
 #include "glsl/ir.h"
 
 class fs_bblock;
+namespace {
+   class acp_entry;
+}
 
 enum register_file {
    BAD_FILE,
@@ -492,6 +495,7 @@ public:
    bool opt_cse();
    bool opt_cse_local(fs_bblock *block, exec_list *aeb);
    bool opt_copy_propagate();
+   bool try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry);
    bool opt_copy_propagate_local(void *mem_ctx, fs_bblock *block,
                                 exec_list *acp);
    bool register_coalesce();
index 23960514bf00df37bab94ac6610be752b8f94d7d..d510e5b3609dd52f5c781193dc88adbd867813f9 100644 (file)
@@ -31,6 +31,21 @@ struct acp_entry : public exec_node {
 };
 }
 
+bool
+fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
+{
+   if (inst->src[arg].file != entry->dst.file ||
+       inst->src[arg].reg != entry->dst.reg ||
+       inst->src[arg].reg_offset != entry->dst.reg_offset) {
+      return false;
+   }
+
+   inst->src[arg].reg = entry->src.reg;
+   inst->src[arg].reg_offset = entry->src.reg_offset;
+
+   return true;
+}
+
 /** @file brw_fs_copy_propagation.cpp
  *
  * Support for local copy propagation by walking the list of instructions
@@ -58,13 +73,8 @@ fs_visitor::opt_copy_propagate_local(void *mem_ctx,
         acp_entry *entry = (acp_entry *)entry_node;
 
         for (int i = 0; i < 3; i++) {
-           if (inst->src[i].file == entry->dst.file &&
-               inst->src[i].reg == entry->dst.reg &&
-               inst->src[i].reg_offset == entry->dst.reg_offset) {
-              inst->src[i].reg = entry->src.reg;
-              inst->src[i].reg_offset = entry->src.reg_offset;
+           if (try_copy_propagate(inst, i, entry))
               progress = true;
-           }
         }
       }