mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 17:50:12 +01:00
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:
parent
3659d36087
commit
a6b0783375
3 changed files with 24 additions and 18 deletions
|
|
@ -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--;
|
||||||
|
|
|
||||||
|
|
@ -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++)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue