diff options
author | Jason Ekstrand <[email protected]> | 2015-04-01 15:38:23 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2015-05-06 10:29:30 -0700 |
commit | 32af7d4188e286a525081ada9965070dd41dbab7 (patch) | |
tree | 9169a9b13b17333c526f4e575608140b54118dad /src/mesa/drivers/dri/i965/brw_fs_cse.cpp | |
parent | 76c1086f2dfb37a1edf6d2df6eebbe11ccbfc50b (diff) |
i965/fs_inst: Add an is_copy_payload helper
This commit adds a new is_copy_payload helper to fs_inst that takes the
place of the similarly named functions in cse and register coalesce. The
two is_copy_payload functions in CSE and register coalesce were subtly
different and potentially subtly broken. The new version unifies the two
and should be more correct.
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_cse.cpp')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 22 |
1 files changed, 3 insertions, 19 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp index ad38475d834..fc19e0f38f2 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp @@ -43,23 +43,7 @@ struct aeb_entry : public exec_node { } static bool -is_copy_payload(const fs_inst *inst) -{ - const int reg = inst->src[0].reg; - if (inst->src[0].reg_offset != 0) - return false; - - for (int i = 1; i < inst->sources; i++) { - if (inst->src[i].reg != reg || - inst->src[i].reg_offset != i) { - return false; - } - } - return true; -} - -static bool -is_expression(const fs_inst *const inst) +is_expression(const fs_visitor *v, const fs_inst *const inst) { switch (inst->opcode) { case BRW_OPCODE_MOV: @@ -104,7 +88,7 @@ is_expression(const fs_inst *const inst) case SHADER_OPCODE_COS: return inst->mlen < 2; case SHADER_OPCODE_LOAD_PAYLOAD: - return !is_copy_payload(inst); + return !inst->is_copy_payload(v->alloc); default: return inst->is_send_from_grf() && !inst->has_side_effects(); } @@ -219,7 +203,7 @@ fs_visitor::opt_cse_local(bblock_t *block) int ip = block->start_ip; foreach_inst_in_block(fs_inst, inst, block) { /* Skip some cases. */ - if (is_expression(inst) && !inst->is_partial_write() && + if (is_expression(this, inst) && !inst->is_partial_write() && (inst->dst.file != HW_REG || inst->dst.is_null())) { bool found = false; |