summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2016-09-01 19:42:40 -0700
committerFrancisco Jerez <[email protected]>2016-09-14 14:50:55 -0700
commitfcd9d1badcd97486eea5d87bf701a3b0a16b4ba9 (patch)
tree565d448d7c375a14a6ea4ffabb20ebcc69e6b8b4 /src
parent56bcb2230f4c396d3febc8d718dc838c0274e62a (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.cpp9
-rw-r--r--src/mesa/drivers/dri/i965/brw_shader.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4.cpp14
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_cmod_propagation.cpp4
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp4
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 e599235a73c..951e6b250de 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 0de08086517..ba2404a7eb4 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 86245e101ba..eaf2dd54ffe 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 e74bc155fe1..99773177cdb 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 777d2529bb5..fe76dea7958 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