brw: Use brw_range to store Vars ranges

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34253>
This commit is contained in:
Caio Oliveira
2025-03-26 19:38:50 -07:00
committed by Marge Bot
parent 0b4a3c0ff6
commit 596bbb2c95
3 changed files with 18 additions and 35 deletions
+1 -2
View File
@@ -477,8 +477,7 @@ public:
* Final computed live ranges for each var (each component of each virtual
* GRF).
*/
int *start;
int *end;
brw_range *vars_range;
/** @} */
/** @{
+13 -27
View File
@@ -57,8 +57,7 @@ brw_live_variables::setup_one_read(struct block_data *bd,
int var = var_from_reg(reg);
assert(var < num_vars);
start[var] = MIN2(start[var], ip);
end[var] = MAX2(end[var], ip);
vars_range[var] = merge(vars_range[var], ip);
/* The use[] bitset marks when the block makes use of a variable (VGRF
* channel) without having completely defined that variable within the
@@ -75,8 +74,7 @@ brw_live_variables::setup_one_write(struct block_data *bd, brw_inst *inst,
int var = var_from_reg(reg);
assert(var < num_vars);
start[var] = MIN2(start[var], ip);
end[var] = MAX2(end[var], ip);
vars_range[var] = merge(vars_range[var], ip);
/* The def[] bitset marks when an initialization in a block completely
* screens off previous updates of that variable (VGRF channel).
@@ -232,15 +230,11 @@ brw_live_variables::compute_start_end()
struct block_data *bd = &block_data[block->num];
unsigned i;
BITSET_FOREACH_SET(i, bd->livein, (unsigned)num_vars) {
start[i] = MIN2(start[i], bd->ip_range.start);
end[i] = MAX2(end[i], bd->ip_range.start);
}
BITSET_FOREACH_SET(i, bd->livein, (unsigned)num_vars)
vars_range[i] = merge(vars_range[i], bd->ip_range.start);
BITSET_FOREACH_SET(i, bd->liveout, (unsigned)num_vars) {
start[i] = MIN2(start[i], bd->ip_range.end);
end[i] = MAX2(end[i], bd->ip_range.end);
}
BITSET_FOREACH_SET(i, bd->liveout, (unsigned)num_vars)
vars_range[i] = merge(vars_range[i], bd->ip_range.end);
}
}
@@ -265,12 +259,9 @@ brw_live_variables::brw_live_variables(const brw_shader *s)
}
}
start = linear_alloc_array(lin_ctx, int, num_vars);
end = linear_alloc_array(lin_ctx, int, num_vars);
for (int i = 0; i < num_vars; i++) {
start[i] = MAX_INSTRUCTION;
end[i] = -1;
}
vars_range = linear_alloc_array(lin_ctx, brw_range, num_vars);
for (int i = 0; i < num_vars; i++)
vars_range[i] = { MAX_INSTRUCTION, -1 };
vgrf_range = linear_alloc_array(lin_ctx, brw_range, num_vgrfs);
for (int i = 0; i < num_vgrfs; i++)
@@ -304,7 +295,7 @@ brw_live_variables::brw_live_variables(const brw_shader *s)
/* Merge the per-component live ranges to whole VGRF live ranges. */
for (int i = 0; i < num_vars; i++) {
const unsigned vgrf = vgrf_from_var[i];
vgrf_range[vgrf] = merge(vgrf_range[vgrf], { start[i], end[i] });
vgrf_range[vgrf] = merge(vgrf_range[vgrf], vars_range[i]);
}
}
@@ -324,9 +315,7 @@ check_register_live_range(const brw_live_variables *live, int ip,
return false;
for (unsigned j = 0; j < n; j++) {
const brw_range var_range{ live->start[var + j],
live->end[var + j] };
if (!var_range.contains(ip))
if (!live->vars_range[var + j].contains(ip))
return false;
}
@@ -362,11 +351,8 @@ brw_live_variables::vars_interfere(int a, int b) const
/* Clip the ranges so the end of a live range can overlap with
* the start of another live range. See details in vgrfs_interfere().
*/
brw_range ra{start[a], end[a]};
brw_range rb{start[b], end[b]};
return overlaps(clip_end(ra, 1),
clip_end(rb, 1));
return overlaps(clip_end(vars_range[a], 1),
clip_end(vars_range[b], 1));
}
bool
@@ -105,8 +105,8 @@ can_coalesce_vars(const intel_device_info *devinfo,
if (!live.vars_interfere(src_var, dst_var))
return true;
brw_range dst_range{ live.start[dst_var], live.end[dst_var] };
brw_range src_range{ live.start[src_var], live.end[src_var] };
brw_range dst_range = live.vars_range[dst_var];
brw_range src_range = live.vars_range[src_var];
/* Variables interfere and one live range isn't a subset of the other. */
if (!dst_range.contains(src_range) &&
@@ -374,10 +374,8 @@ brw_opt_register_coalesce(brw_shader &s)
}
for (int i = 0; i < src_size; i++) {
live.start[dst_var[i]] = MIN2(live.start[dst_var[i]],
live.start[src_var[i]]);
live.end[dst_var[i]] = MAX2(live.end[dst_var[i]],
live.end[src_var[i]]);
live.vars_range[dst_var[i]] = merge(live.vars_range[dst_var[i]],
live.vars_range[src_var[i]]);
}
src_reg = ~0u;
}