From f02914a991a19de6a54e45d760eb9de8f4bbae46 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 14 Jan 2019 22:21:48 -0600 Subject: [PATCH] intel/fs/cse: Split create_copy_instr into three cases Previously, we tried to combine all cases where the instruction being CSE'd writes to more than one MOV worth of registers into one case with a bit of special casing for LOAD_PAYLOAD. This commit splits things so that LOAD_PAYLOAD is entirely it's own case. This makes tweaking the LOAD_PAYLOAD case simpler in the next commit. Reviewed-by: Kenneth Graunke --- src/intel/compiler/brw_fs_cse.cpp | 34 +++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/intel/compiler/brw_fs_cse.cpp b/src/intel/compiler/brw_fs_cse.cpp index 9b897804032..bd917baaa6d 100644 --- a/src/intel/compiler/brw_fs_cse.cpp +++ b/src/intel/compiler/brw_fs_cse.cpp @@ -207,30 +207,30 @@ create_copy_instr(const fs_builder &bld, fs_inst *inst, fs_reg src, bool negate) DIV_ROUND_UP(inst->dst.component_size(inst->exec_size), REG_SIZE); fs_inst *copy; - if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD || - written != dst_width) { - fs_reg *payload; - int sources, header_size; - if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD) { - sources = inst->sources; - header_size = inst->header_size; - } else { - assert(written % dst_width == 0); - sources = written / dst_width; - header_size = 0; - } - + if (inst->opcode == SHADER_OPCODE_LOAD_PAYLOAD) { assert(src.file == VGRF); - payload = ralloc_array(bld.shader->mem_ctx, fs_reg, sources); - for (int i = 0; i < header_size; i++) { + fs_reg *payload = ralloc_array(bld.shader->mem_ctx, fs_reg, + inst->sources); + for (int i = 0; i < inst->header_size; i++) { payload[i] = src; src.offset += REG_SIZE; } - for (int i = header_size; i < sources; i++) { + for (int i = inst->header_size; i < inst->sources; i++) { + payload[i] = src; + src = offset(src, bld, 1); + } + copy = bld.LOAD_PAYLOAD(inst->dst, payload, inst->sources, + inst->header_size); + } else if (written != dst_width) { + assert(src.file == VGRF); + assert(written % dst_width == 0); + const int sources = written / dst_width; + fs_reg *payload = ralloc_array(bld.shader->mem_ctx, fs_reg, sources); + for (int i = 0; i < sources; i++) { payload[i] = src; src = offset(src, bld, 1); } - copy = bld.LOAD_PAYLOAD(inst->dst, payload, sources, header_size); + copy = bld.LOAD_PAYLOAD(inst->dst, payload, sources, 0); } else { copy = bld.MOV(inst->dst, src); copy->group = inst->group; -- 2.30.2