brw: Use brw_ip_ranges in scheduling / regalloc

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34012>
This commit is contained in:
Caio Oliveira 2025-03-11 13:20:09 -07:00 committed by Marge Bot
parent 3659d36087
commit a6b0783375
3 changed files with 24 additions and 18 deletions

View file

@ -129,10 +129,10 @@ brw_alloc_reg_sets(struct brw_compiler *compiler)
} }
static int static int
count_to_loop_end(const bblock_t *block) count_to_loop_end(const bblock_t *block, const brw_ip_ranges &ips)
{ {
if (block->end()->opcode == BRW_OPCODE_WHILE) if (block->end()->opcode == BRW_OPCODE_WHILE)
return block->end_ip; return ips.end(block);
int depth = 1; int depth = 1;
/* Skip the first block, since we don't want to count the do the calling /* Skip the first block, since we don't want to count the do the calling
@ -146,7 +146,7 @@ count_to_loop_end(const bblock_t *block)
if (block->end()->opcode == BRW_OPCODE_WHILE) { if (block->end()->opcode == BRW_OPCODE_WHILE) {
depth--; depth--;
if (depth == 0) if (depth == 0)
return block->end_ip; return ips.end(block);
} }
} }
unreachable("not reached"); unreachable("not reached");
@ -156,6 +156,8 @@ void brw_shader::calculate_payload_ranges(bool allow_spilling,
unsigned payload_node_count, unsigned payload_node_count,
int *payload_last_use_ip) const int *payload_last_use_ip) const
{ {
const brw_ip_ranges &ips = this->ip_ranges_analysis.require();
int loop_depth = 0; int loop_depth = 0;
int loop_end_ip = 0; int loop_end_ip = 0;
@ -174,7 +176,7 @@ void brw_shader::calculate_payload_ranges(bool allow_spilling,
* the end now. * the end now.
*/ */
if (loop_depth == 1) if (loop_depth == 1)
loop_end_ip = count_to_loop_end(block); loop_end_ip = count_to_loop_end(block, ips);
break; break;
case BRW_OPCODE_WHILE: case BRW_OPCODE_WHILE:
loop_depth--; loop_depth--;

View file

@ -594,7 +594,7 @@ public:
void add_dep(schedule_node *before, schedule_node *after); void add_dep(schedule_node *before, schedule_node *after);
void add_address_dep(schedule_node *before, schedule_node *after); void add_address_dep(schedule_node *before, schedule_node *after);
void set_current_block(bblock_t *block); void set_current_block(bblock_t *block, const brw_ip_ranges &ips);
void compute_delays(); void compute_delays();
void compute_exits(); void compute_exits();
@ -781,8 +781,10 @@ brw_instruction_scheduler::brw_instruction_scheduler(void *mem_ctx, const brw_sh
this->hw_reads_remaining = NULL; this->hw_reads_remaining = NULL;
} }
const brw_ip_ranges &ips = s->ip_ranges_analysis.require();
foreach_block(block, s->cfg) { foreach_block(block, s->cfg) {
set_current_block(block); set_current_block(block, ips);
for (schedule_node *n = current.start; n < current.end; n++) for (schedule_node *n = current.start; n < current.end; n++)
n->issue_time = calculate_issue_time(n->inst); n->issue_time = calculate_issue_time(n->inst);
@ -828,6 +830,7 @@ void
brw_instruction_scheduler::setup_liveness(cfg_t *cfg) brw_instruction_scheduler::setup_liveness(cfg_t *cfg)
{ {
const brw_live_variables &live = s->live_analysis.require(); const brw_live_variables &live = s->live_analysis.require();
const brw_ip_ranges &ips = s->ip_ranges_analysis.require();
/* First, compute liveness on a per-GRF level using the in/out sets from /* First, compute liveness on a per-GRF level using the in/out sets from
* liveness calculation. * liveness calculation.
@ -853,8 +856,8 @@ brw_instruction_scheduler::setup_liveness(cfg_t *cfg)
*/ */
for (int block = 0; block < cfg->num_blocks - 1; block++) { for (int block = 0; block < cfg->num_blocks - 1; block++) {
for (int i = 0; i < grf_count; i++) { for (int i = 0; i < grf_count; i++) {
if (live.vgrf_start[i] <= cfg->blocks[block]->end_ip && if (live.vgrf_start[i] <= ips.end(cfg->blocks[block]) &&
live.vgrf_end[i] >= cfg->blocks[block + 1]->start_ip) { live.vgrf_end[i] >= ips.start(cfg->blocks[block + 1])) {
if (!BITSET_TEST(livein[block + 1], i)) { if (!BITSET_TEST(livein[block + 1], i)) {
reg_pressure_in[block + 1] += s->alloc.sizes[i]; reg_pressure_in[block + 1] += s->alloc.sizes[i];
BITSET_SET(livein[block + 1], i); BITSET_SET(livein[block + 1], i);
@ -873,10 +876,10 @@ brw_instruction_scheduler::setup_liveness(cfg_t *cfg)
continue; continue;
for (int block = 0; block < cfg->num_blocks; block++) { for (int block = 0; block < cfg->num_blocks; block++) {
if (cfg->blocks[block]->start_ip <= payload_last_use_ip[i]) if (ips.start(cfg->blocks[block]) <= payload_last_use_ip[i])
reg_pressure_in[block]++; reg_pressure_in[block]++;
if (cfg->blocks[block]->end_ip <= payload_last_use_ip[i]) if (ips.end(cfg->blocks[block]) <= payload_last_use_ip[i])
BITSET_SET(hw_liveout[block], i); BITSET_SET(hw_liveout[block], i);
} }
} }
@ -944,11 +947,11 @@ brw_instruction_scheduler::get_register_pressure_benefit(const brw_inst *inst)
} }
void void
brw_instruction_scheduler::set_current_block(bblock_t *block) brw_instruction_scheduler::set_current_block(bblock_t *block, const brw_ip_ranges &ips)
{ {
current.block = block; current.block = block;
current.start = nodes + block->start_ip; current.start = nodes + ips.start(block);
current.len = block->end_ip - block->start_ip + 1; current.len = block->num_instructions;
current.end = current.start + current.len; current.end = current.start + current.len;
current.time = 0; current.time = 0;
current.scheduled = 0; current.scheduled = 0;
@ -1807,8 +1810,10 @@ brw_instruction_scheduler::run(brw_instruction_scheduler_mode mode)
memset(written, 0, grf_count * sizeof(*written)); memset(written, 0, grf_count * sizeof(*written));
} }
const brw_ip_ranges &ips = s->ip_ranges_analysis.require();
foreach_block(block, s->cfg) { foreach_block(block, s->cfg) {
set_current_block(block); set_current_block(block, ips);
if (!post_reg_alloc) { if (!post_reg_alloc) {
for (schedule_node *n = current.start; n < current.end; n++) for (schedule_node *n = current.start; n < current.end; n++)

View file

@ -1017,7 +1017,6 @@ save_instruction_order(const struct cfg_t *cfg)
int ip = 0; int ip = 0;
foreach_block_and_inst(block, brw_inst, inst, cfg) { foreach_block_and_inst(block, brw_inst, inst, cfg) {
assert(ip >= block->start_ip && ip <= block->end_ip);
inst_arr[ip++] = inst; inst_arr[ip++] = inst;
} }
assert(ip == num_insts); assert(ip == num_insts);
@ -1034,9 +1033,8 @@ restore_instruction_order(struct cfg_t *cfg, brw_inst **inst_arr)
foreach_block (block, cfg) { foreach_block (block, cfg) {
block->instructions.make_empty(); block->instructions.make_empty();
assert(ip == block->start_ip); for (unsigned i = 0; i < block->num_instructions; i++)
for (; ip <= block->end_ip; ip++) block->instructions.push_tail(inst_arr[ip++]);
block->instructions.push_tail(inst_arr[ip]);
} }
assert(ip == num_insts); assert(ip == num_insts);
} }
@ -1134,6 +1132,7 @@ brw_allocate_registers(brw_shader &s, bool allow_spilling)
/* Reset back to the original order before trying the next mode */ /* Reset back to the original order before trying the next mode */
restore_instruction_order(s.cfg, orig_order); restore_instruction_order(s.cfg, orig_order);
s.invalidate_analysis(BRW_DEPENDENCY_INSTRUCTIONS); s.invalidate_analysis(BRW_DEPENDENCY_INSTRUCTIONS);
} }