From d11e1b790937f6b0cacbd00bc3ecddf8d0931453 Mon Sep 17 00:00:00 2001 From: Vasily Khoruzhick Date: Sun, 18 Aug 2019 22:57:54 -0700 Subject: [PATCH] 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 Reviewed-by: Qiang Yu Reviewed-by: Erico Nunes Signed-off-by: Vasily Khoruzhick --- src/gallium/drivers/lima/ir/pp/nir.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/lima/ir/pp/nir.c b/src/gallium/drivers/lima/ir/pp/nir.c index f7eaccd7c63..669e5fb4101 100644 --- a/src/gallium/drivers/lima/ir/pp/nir.c +++ b/src/gallium/drivers/lima/ir/pp/nir.c @@ -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)) -- 2.30.2