lima/ppir: add write after read deps for registers

For cases like:

(1) r1 = r2
(2) r2 = ssa1

We need to add (1) as dependency of (2), otherwise scheduler may
reorder them.

Tested-by: Andreas Baierl <ichgeh@imkreisrum.de>
Reviewed-by: Qiang Yu <yuq825@gmail.com>
Reviewed-by: Erico Nunes <nunes.erico@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
This commit is contained in:
Vasily Khoruzhick 2019-08-18 22:57:54 -07:00
parent cd8c569ced
commit d11e1b7909
1 changed files with 25 additions and 2 deletions

View File

@ -611,6 +611,28 @@ static void ppir_print_shader_db(struct nir_shader *nir, ppir_compiler *comp,
free(shaderdb);
}
static void ppir_add_write_after_read_deps(ppir_compiler *comp)
{
list_for_each_entry(ppir_block, block, &comp->block_list, list) {
list_for_each_entry(ppir_reg, reg, &comp->reg_list, list) {
ppir_node *write = NULL;
list_for_each_entry_rev(ppir_node, node, &block->node_list, list) {
for (int i = 0; i < ppir_node_get_src_num(node); i++) {
ppir_src *src = ppir_node_get_src(node, i);
if (src && src->type == ppir_target_register &&
src->reg == reg &&
write)
ppir_node_add_dep(write, node);
}
ppir_dest *dest = ppir_node_get_dest(node);
if (dest && dest->type == ppir_target_register &&
dest->reg == reg)
write = node;
}
}
}
}
bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
struct ra_regs *ra,
struct pipe_debug_callback *debug)
@ -642,13 +664,14 @@ bool ppir_compile_nir(struct lima_fs_shader_state *prog, struct nir_shader *nir,
if (comp->discard_block)
list_addtail(&comp->discard_block->list, &comp->block_list);
ppir_add_ordering_deps(comp);
ppir_node_print_prog(comp);
if (!ppir_lower_prog(comp))
goto err_out0;
ppir_add_ordering_deps(comp);
ppir_add_write_after_read_deps(comp);
ppir_node_print_prog(comp);
if (!ppir_node_to_instr(comp))