i965/fs: Move copy propagation test out to a separate function.

It's going to get more complicated in a moment.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Eric Anholt
2012-06-06 10:57:54 -07:00
parent 5fb178ee43
commit 458f7f0141
2 changed files with 20 additions and 6 deletions
+4
View 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();
@@ -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;
}
}
}