Improves three programs in Unigine Tropics. total instructions in shared programs: 1549880 -> 1549868 (-0.00%) instructions in affected programs: 858 -> 846 (-1.40%) --- src/mesa/drivers/dri/i965/brw_fs.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 39041e3..e4ac0a5 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -2270,10 +2270,15 @@ fs_visitor::register_coalesce() int reg_from = -1, reg_to = -1; int reg_to_offset[MAX_SAMPLER_MESSAGE_SIZE]; fs_inst *mov[MAX_SAMPLER_MESSAGE_SIZE]; + int last_use[MAX_SAMPLER_MESSAGE_SIZE]; + int next_ip = 0; foreach_list_safe(node, &this->instructions) { fs_inst *inst = (fs_inst *)node; + int ip = next_ip; + next_ip++; + if (inst->opcode != BRW_OPCODE_MOV || inst->is_partial_write() || inst->saturate || @@ -2306,6 +2311,14 @@ fs_visitor::register_coalesce() channels_remaining = src_size; memset(mov, 0, sizeof(mov)); + fs_reg src = inst->src[0]; + for (int i = 0; i < src_size; i++) { + src.reg_offset = i; + int var = live_intervals->var_from_reg(&src); + + last_use[i] = live_intervals->end[var]; + } + reg_to = inst->dst.reg; } @@ -2317,7 +2330,16 @@ fs_visitor::register_coalesce() mov[offset] = inst; channels_remaining--; - if (channels_remaining) + int live_channels_remaining = channels_remaining; + for (int i = 0; i < src_size; i++) { + if (!mov[i]) { + if (last_use[i] < ip) { + live_channels_remaining--; + } + } + } + + if (live_channels_remaining) continue; for (int i = 0; i < src_size; i++) { -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev