Since CSE creates instructions, if we let CSE generate things register coalescing can't remove, bad things will happen. Only let CSE combine non-copy load_payloads.
E.g., allow CSE to handle this load_payload vgrf4+0, vgrf5, vgrf6 but not this load_payload vgrf4+0, vgrf5+0, vgrf5+1 --- src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp index 5037579..75c6aab 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp @@ -43,6 +43,22 @@ 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) { switch (inst->opcode) { @@ -73,6 +89,8 @@ is_expression(const fs_inst *const inst) case FS_OPCODE_CINTERP: case FS_OPCODE_LINTERP: return true; + case SHADER_OPCODE_LOAD_PAYLOAD: + return !is_copy_payload(inst); default: return false; } -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev