From fcd9d1badcd97486eea5d87bf701a3b0a16b4ba9 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Thu, 1 Sep 2016 19:42:40 -0700 Subject: [PATCH] i965/vec4: Drop backend_reg::in_range() in favor of regions_overlap(). This makes sure that overlap checks are done correctly throughout the back-end when the '*this' register starts before the register/size pair provided as argument, and is actually less annoying to use than in_range() at this point since regions_overlap() takes its size arguments in bytes. Reviewed-by: Iago Toral Quiroga --- src/mesa/drivers/dri/i965/brw_shader.cpp | 9 --------- src/mesa/drivers/dri/i965/brw_shader.h | 1 - src/mesa/drivers/dri/i965/brw_vec4.cpp | 14 ++++++++------ src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp | 4 ++-- src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 4 ++-- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index e599235..951e6b2 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -745,15 +745,6 @@ backend_reg::is_accumulator() const } bool -backend_reg::in_range(const backend_reg &r, unsigned n) const -{ - return (file == r.file && - nr == r.nr && - offset >= r.offset && - offset < r.offset + n * REG_SIZE); -} - -bool backend_instruction::is_commutative() const { switch (opcode) { diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h index 0de0808..ba2404a 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -62,7 +62,6 @@ struct backend_reg : private brw_reg bool is_negative_one() const; bool is_null() const; bool is_accumulator() const; - bool in_range(const backend_reg &r, unsigned n) const; /** Offset from the start of the (virtual) register in bytes. */ uint16_t offset; diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp index 86245e1..eaf2dd5 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp @@ -1143,7 +1143,8 @@ vec4_visitor::opt_register_coalesce() inst) { _scan_inst = scan_inst; - if (inst->src[0].in_range(scan_inst->dst, DIV_ROUND_UP(scan_inst->size_written, REG_SIZE))) { + if (regions_overlap(inst->src[0], inst->size_read(0), + scan_inst->dst, scan_inst->size_written)) { /* Found something writing to the reg we want to coalesce away. */ if (to_mrf) { /* SEND instructions can't have MRF as a destination. */ @@ -1197,8 +1198,8 @@ vec4_visitor::opt_register_coalesce() */ bool interfered = false; for (int i = 0; i < 3; i++) { - if (inst->src[0].in_range(scan_inst->src[i], - DIV_ROUND_UP(scan_inst->size_read(i), REG_SIZE))) + if (regions_overlap(inst->src[0], inst->size_read(0), + scan_inst->src[i], scan_inst->size_read(i))) interfered = true; } if (interfered) @@ -1207,7 +1208,8 @@ vec4_visitor::opt_register_coalesce() /* If somebody else writes the same channels of our destination here, * we can't coalesce before that. */ - if (inst->dst.in_range(scan_inst->dst, DIV_ROUND_UP(scan_inst->size_written, REG_SIZE)) && + if (regions_overlap(inst->dst, inst->size_written, + scan_inst->dst, scan_inst->size_written) && (inst->dst.writemask & scan_inst->dst.writemask) != 0) { break; } @@ -1223,8 +1225,8 @@ vec4_visitor::opt_register_coalesce() } } else { for (int i = 0; i < 3; i++) { - if (inst->dst.in_range(scan_inst->src[i], - DIV_ROUND_UP(scan_inst->size_read(i), REG_SIZE))) + if (regions_overlap(inst->dst, inst->size_written, + scan_inst->src[i], scan_inst->size_read(i))) interfered = true; } if (interfered) diff --git a/src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp index e74bc15..9977317 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp @@ -68,8 +68,8 @@ opt_cmod_propagation_local(bblock_t *block) bool read_flag = false; foreach_inst_in_block_reverse_starting_from(vec4_instruction, scan_inst, inst) { - if (inst->src[0].in_range(scan_inst->dst, - DIV_ROUND_UP(scan_inst->size_written, REG_SIZE))) { + if (regions_overlap(inst->src[0], inst->size_read(0), + scan_inst->dst, scan_inst->size_written)) { if ((scan_inst->predicate && scan_inst->opcode != BRW_OPCODE_SEL) || scan_inst->dst.offset / REG_SIZE != inst->src[0].offset / REG_SIZE || (scan_inst->dst.writemask != WRITEMASK_X && diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp index 777d252..fe76dea 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -72,8 +72,8 @@ is_channel_updated(vec4_instruction *inst, src_reg *values[4], int ch) if (!src || src->file != VGRF) return false; - return (src->in_range(inst->dst, DIV_ROUND_UP(inst->size_written, REG_SIZE)) && - inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch))); + return regions_overlap(*src, REG_SIZE, inst->dst, inst->size_written) && + inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch)); } static bool -- 2.7.4