brw: Pass VGRF numbers to liveness helpers

Compute var_from_reg() once in setup_def_use() and pass the variable
number to setup_one_read() and setup_one_write().  This lets the loops walk
consecutive variable numbers directly instead of mutating a brw_reg offset.

Also: setup_one_write() is only called for VGRFs, so remove the check
for VGRF there.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41496>
This commit is contained in:
Caio Oliveira 2026-05-08 12:17:29 -07:00 committed by Marge Bot
parent 9975a35f43
commit 3f71aab327
2 changed files with 14 additions and 24 deletions

View file

@ -503,9 +503,8 @@ public:
protected:
void setup_def_use();
void setup_one_read(struct block_data *bd, int ip, const brw_reg &reg);
void setup_one_write(struct block_data *bd, brw_inst *inst, int ip,
const brw_reg &reg);
void setup_one_read(struct block_data *bd, int ip, int var);
void setup_one_write(struct block_data *bd, brw_inst *inst, int ip, int var);
void compute_live_variables();
void compute_start_end();

View file

@ -30,9 +30,8 @@
void
brw_live_variables::setup_one_read(struct block_data *bd,
int ip, const brw_reg &reg)
int ip, int var)
{
int var = var_from_reg(reg);
assert(var < num_vars);
vars_range[var] = merge(vars_range[var], ip);
@ -47,9 +46,8 @@ brw_live_variables::setup_one_read(struct block_data *bd,
void
brw_live_variables::setup_one_write(struct block_data *bd, brw_inst *inst,
int ip, const brw_reg &reg)
int ip, int var)
{
int var = var_from_reg(reg);
assert(var < num_vars);
vars_range[var] = merge(vars_range[var], ip);
@ -57,12 +55,10 @@ brw_live_variables::setup_one_write(struct block_data *bd, brw_inst *inst,
/* The def[] bitset marks when an initialization in a block completely
* screens off previous updates of that variable (VGRF channel).
*/
if (inst->dst.file == VGRF) {
if (!inst->is_partial_write() && !BITSET_TEST(bd->use, var))
BITSET_SET(bd->def, var);
if (!inst->is_partial_write() && !BITSET_TEST(bd->use, var))
BITSET_SET(bd->def, var);
BITSET_SET(bd->defout, var);
}
BITSET_SET(bd->defout, var);
}
/**
@ -89,26 +85,21 @@ brw_live_variables::setup_def_use()
foreach_inst_in_block(brw_inst, inst, block) {
/* Set use[] for this instruction */
for (unsigned int i = 0; i < inst->sources; i++) {
brw_reg reg = inst->src[i];
if (reg.file != VGRF)
if (inst->src[i].file != VGRF)
continue;
for (unsigned j = 0; j < regs_read(devinfo, inst, i); j++) {
setup_one_read(bd, ip, reg);
reg.offset += REG_SIZE;
}
const int var = var_from_reg(inst->src[i]);
for (unsigned j = 0; j < regs_read(devinfo, inst, i); j++)
setup_one_read(bd, ip, var + j);
}
bd->flag_use[0] |= inst->flags_read(devinfo) & ~bd->flag_def[0];
/* Set def[] for this instruction */
if (inst->dst.file == VGRF) {
brw_reg reg = inst->dst;
for (unsigned j = 0; j < regs_written(inst); j++) {
setup_one_write(bd, inst, ip, reg);
reg.offset += REG_SIZE;
}
const int var = var_from_reg(inst->dst);
for (unsigned j = 0; j < regs_written(inst); j++)
setup_one_write(bd, inst, ip, var + j);
}
if (!inst->predicate && inst->exec_size >= 8)