i965/fs: Drop fs_inst::overwrites_reg() in favor of regions_overlap().
fs_inst::overwrites_reg is rather easy to misuse because it cannot tell how large the register region starting at 'reg' is, so in cases where the destination region starts after 'reg' it may give a misleading result. regions_overlap() is somewhat more verbose to use but handles arbitrary overlap correctly so it should generally be used instead. Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
parent
32d67923b2
commit
b42c13a5b8
|
@ -240,12 +240,6 @@ fs_inst::equals(fs_inst *inst) const
|
|||
offset == inst->offset);
|
||||
}
|
||||
|
||||
bool
|
||||
fs_inst::overwrites_reg(const fs_reg ®) const
|
||||
{
|
||||
return reg.in_range(dst, DIV_ROUND_UP(size_written, REG_SIZE));
|
||||
}
|
||||
|
||||
bool
|
||||
fs_inst::is_send_from_grf() const
|
||||
{
|
||||
|
|
|
@ -88,7 +88,8 @@ opt_cmod_propagation_local(const gen_device_info *devinfo, bblock_t *block)
|
|||
|
||||
bool read_flag = false;
|
||||
foreach_inst_in_block_reverse_starting_from(fs_inst, scan_inst, inst) {
|
||||
if (scan_inst->overwrites_reg(inst->src[0])) {
|
||||
if (regions_overlap(scan_inst->dst, scan_inst->size_written,
|
||||
inst->src[0], inst->size_read(0))) {
|
||||
if (scan_inst->is_partial_write() ||
|
||||
scan_inst->dst.offset != inst->src[0].offset ||
|
||||
scan_inst->exec_size != inst->exec_size)
|
||||
|
|
|
@ -161,8 +161,10 @@ fs_copy_prop_dataflow::setup_initial_values()
|
|||
|
||||
/* Mark ACP entries which are killed by this instruction. */
|
||||
for (int i = 0; i < num_acp; i++) {
|
||||
if (inst->overwrites_reg(acp[i]->dst) ||
|
||||
inst->overwrites_reg(acp[i]->src)) {
|
||||
if (regions_overlap(inst->dst, inst->size_written,
|
||||
acp[i]->dst, acp[i]->size_written) ||
|
||||
regions_overlap(inst->dst, inst->size_written,
|
||||
acp[i]->src, acp[i]->size_read)) {
|
||||
BITSET_SET(bd[block->num].kill, i);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -335,7 +335,9 @@ fs_visitor::opt_cse_local(bblock_t *block)
|
|||
/* Kill all AEB entries that use the destination we just
|
||||
* overwrote.
|
||||
*/
|
||||
if (inst->overwrites_reg(entry->generator->src[i])) {
|
||||
if (regions_overlap(inst->dst, inst->size_written,
|
||||
entry->generator->src[i],
|
||||
entry->generator->size_read(i))) {
|
||||
entry->remove();
|
||||
ralloc_free(entry);
|
||||
break;
|
||||
|
|
|
@ -138,8 +138,10 @@ can_coalesce_vars(brw::fs_live_variables *live_intervals,
|
|||
if (scan_ip > end_ip)
|
||||
return true; /* registers do not interfere */
|
||||
|
||||
if (scan_inst->overwrites_reg(inst->dst) ||
|
||||
scan_inst->overwrites_reg(inst->src[0]))
|
||||
if (regions_overlap(scan_inst->dst, scan_inst->size_written,
|
||||
inst->dst, inst->size_written) ||
|
||||
regions_overlap(scan_inst->dst, scan_inst->size_written,
|
||||
inst->src[0], inst->size_read(0)))
|
||||
return false; /* registers interfere */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,7 +64,8 @@ opt_saturate_propagation_local(fs_visitor *v, bblock_t *block)
|
|||
|
||||
bool interfered = false;
|
||||
foreach_inst_in_block_reverse_starting_from(fs_inst, scan_inst, inst) {
|
||||
if (scan_inst->overwrites_reg(inst->src[0])) {
|
||||
if (regions_overlap(scan_inst->dst, scan_inst->size_written,
|
||||
inst->src[0], inst->size_read(0))) {
|
||||
if (scan_inst->is_partial_write() ||
|
||||
(scan_inst->dst.type != inst->dst.type &&
|
||||
!scan_inst->can_change_types()))
|
||||
|
|
|
@ -334,7 +334,6 @@ public:
|
|||
void resize_sources(uint8_t num_sources);
|
||||
|
||||
bool equals(fs_inst *inst) const;
|
||||
bool overwrites_reg(const fs_reg ®) const;
|
||||
bool is_send_from_grf() const;
|
||||
bool is_partial_write() const;
|
||||
bool is_copy_payload(const brw::simple_allocator &grf_alloc) const;
|
||||
|
|
Loading…
Reference in New Issue