}
/**
+ * Like reg_offset, but register must be VGRF or FIXED_GRF.
+ */
+static inline unsigned
+grf_reg_offset(const fs_reg &r)
+{
+ return (r.file == VGRF ? 0 : r.nr) * REG_SIZE +
+ r.offset +
+ (r.file == FIXED_GRF ? r.subnr : 0);
+}
+
+/**
+ * Like regions_overlap, but register must be VGRF or FIXED_GRF.
+ */
+static inline bool
+grf_regions_overlap(const fs_reg &r, unsigned dr, const fs_reg &s, unsigned ds)
+{
+ return reg_space(r) == reg_space(s) &&
+ !(grf_reg_offset(r) + dr <= grf_reg_offset(s) ||
+ grf_reg_offset(s) + ds <= grf_reg_offset(r));
+}
+
+/**
* Set up initial values for each of the data flow sets, prior to running
* the fixed-point algorithm.
*/
unsigned idx = reg_space(inst->dst) & (acp_table_size - 1);
foreach_in_list(acp_entry, entry, &acp_table[idx]) {
- if (regions_overlap(inst->dst, inst->size_written,
- entry->dst, entry->size_written)) {
+ if (grf_regions_overlap(inst->dst, inst->size_written,
+ entry->dst, entry->size_written)) {
BITSET_SET(bd[block->num].kill, entry->global_idx);
if (inst->force_writemask_all && !entry->force_writemask_all)
BITSET_SET(bd[block->num].exec_mismatch, entry->global_idx);
unsigned idx = reg_space(inst->dst) & (acp_table_size - 1);
foreach_in_list(acp_entry, entry, &acp_table[idx]) {
- if (regions_overlap(inst->dst, inst->size_written,
- entry->src, entry->size_read)) {
+ if (grf_regions_overlap(inst->dst, inst->size_written,
+ entry->src, entry->size_read)) {
BITSET_SET(bd[block->num].kill, entry->global_idx);
if (inst->force_writemask_all && !entry->force_writemask_all)
BITSET_SET(bd[block->num].exec_mismatch, entry->global_idx);
return (inst->opcode == BRW_OPCODE_MOV &&
inst->dst.file == VGRF &&
((inst->src[0].file == VGRF &&
- !regions_overlap(inst->dst, inst->size_written,
- inst->src[0], inst->size_read(0))) ||
+ !grf_regions_overlap(inst->dst, inst->size_written,
+ inst->src[0], inst->size_read(0))) ||
inst->src[0].file == ATTR ||
inst->src[0].file == UNIFORM ||
inst->src[0].file == IMM ||
/* kill the destination from the ACP */
if (inst->dst.file == VGRF || inst->dst.file == FIXED_GRF) {
foreach_in_list_safe(acp_entry, entry, &acp[inst->dst.nr % ACP_HASH_SIZE]) {
- if (regions_overlap(entry->dst, entry->size_written,
- inst->dst, inst->size_written))
+ if (grf_regions_overlap(entry->dst, entry->size_written,
+ inst->dst, inst->size_written))
entry->remove();
}
/* Make sure we kill the entry if this instruction overwrites
* _any_ of the registers that it reads
*/
- if (regions_overlap(entry->src, entry->size_read,
- inst->dst, inst->size_written))
+ if (grf_regions_overlap(entry->src, entry->size_read,
+ inst->dst, inst->size_written))
entry->remove();
}
}