diff options
author | Qiang Yu <yuq825@gmail.com> | 2017-10-28 18:15:39 +0800 |
---|---|---|
committer | Qiang Yu <yuq825@gmail.com> | 2017-10-28 18:15:39 +0800 |
commit | 3f8b62af6f779d4fe89b262036cf4f325ba1767a (patch) | |
tree | c686af0e0c13a1c5bdfcfc84cc718c5477ad136a | |
parent | 7a5cbf44f949837e822eca12480e03873eb1dcab (diff) |
lima/gpir: more debug print for scheduler
Signed-off-by: Qiang Yu <yuq825@gmail.com>
-rw-r--r-- | src/gallium/drivers/lima/ir/gp/scheduler.c | 69 |
1 files changed, 46 insertions, 23 deletions
diff --git a/src/gallium/drivers/lima/ir/gp/scheduler.c b/src/gallium/drivers/lima/ir/gp/scheduler.c index ccb2a4e8ab..84ce0be6cf 100644 --- a/src/gallium/drivers/lima/ir/gp/scheduler.c +++ b/src/gallium/drivers/lima/ir/gp/scheduler.c @@ -495,6 +495,9 @@ static void gpir_remove_created_node(gpir_block *block, gpir_node *created, if (created->sched_instr >= 0) instr_remove_node(block, created); + gpir_debug("remove created node %d back to %d\n", + created->index, node->index); + gpir_node_delete(created); } @@ -712,6 +715,23 @@ static int insert_load_reg(gpir_block *block, gpir_node *node, int end, return -2; } +static void gpir_print_unsatisfied_succ(gpir_node *node) +{ + if (!lima_shader_debug_gp) + return; + + printf("unsatisfied successors"); + gpir_node_foreach_succ(node, entry) { + gpir_dep_info *dep = gpir_dep_from_entry(entry); + gpir_node *succ = gpir_node_from_entry(entry, succ); + int max = succ->sched_instr + gpir_get_max_dist(dep); + + if (max < node->sched_instr) + printf(" %d", succ->index); + } + printf("\n"); +} + /* * Return: * >=0 - success, the last inserted load instr index @@ -729,6 +749,10 @@ static int gpir_try_insert_load(gpir_block *block, gpir_node *node, int orig_end reg_move = gpir_node_create(block->comp, gpir_op_mov, -1); if (!reg_move) return -2; + list_addtail(®_move->list, &block->node_list); + + gpir_debug("create move %d for load %d to store reg\n", + reg_move->index, node->index); gpir_node_foreach_succ(node, entry) { gpir_node_replace_pred(entry, reg_move); @@ -748,8 +772,10 @@ static int gpir_try_insert_load(gpir_block *block, gpir_node *node, int orig_end current = load; } else { - if (!current) + if (!current) { + gpir_print_unsatisfied_succ(load); return -1; + } gpir_remove_created_node(block, load, current); } @@ -789,8 +815,10 @@ static int gpir_try_insert_load(gpir_block *block, gpir_node *node, int orig_end } /* load reg can't use reg again */ - if (node->op == gpir_op_load_reg) + if (node->op == gpir_op_load_reg) { + gpir_print_unsatisfied_succ(current); return -1; + } /* revert unused created nodes */ while (true) { @@ -823,6 +851,9 @@ static int gpir_try_insert_load(gpir_block *block, gpir_node *node, int orig_end if (!reg_move) return -2; list_addtail(®_move->list, &block->node_list); + + gpir_debug("create move %d for load %d to store reg\n", + reg_move->index, node->index); } /* spill */ @@ -1035,6 +1066,8 @@ static int gpir_try_insert_load_reg(gpir_block *block, gpir_node *node) return -3; list_addtail(&store->list, &block->node_list); + gpir_debug("create store reg %d for %d\n", store->index, node->index); + gpir_node_add_child(store, store_alu); gpir_dep_info *dep = gpir_node_add_read_after_write_dep(load, store); @@ -1057,7 +1090,8 @@ static int gpir_try_insert_load_reg(gpir_block *block, gpir_node *node) int load_end = store->sched_instr - gpir_get_min_dist(dep) + 1; int load_start = gpir_try_insert_load(block, load, load_end); if (load_start < 0) { - gpir_error("insert load reg fail for node %d\n", node->index); + gpir_error("insert load reg fail %d for node %d\n", + load_start, node->index); return load_start == -1 ? -2 : -3; } @@ -1157,27 +1191,14 @@ static bool gpir_try_schedule_node(gpir_block *block, gpir_node *node) return true; } -static void gpir_print_failed_node(gpir_node *node) +static void gpir_print_pre_schedule_node(gpir_node *node) { - /* print failed node's successors until none-sigle successor */ - fprintf(stderr, "gpir: successors"); - gpir_node *next = node; - while (true) { - if (next->succs->entries > 1) - fprintf(stderr, " |"); - - gpir_node *succ = NULL; - gpir_node_foreach_succ(next, entry) { - succ = gpir_node_from_entry(entry, succ); - fprintf(stderr, " %d", succ->index); - } - - if (next->succs->entries > 1 || !succ) - break; - else - next = succ; + printf("gpir: pre schedule node %d successors", node->index); + gpir_node_foreach_succ(node, entry) { + gpir_node *succ = gpir_node_from_entry(entry, succ); + printf(" %d", succ->index); } - fprintf(stderr, "\n"); + printf("\n"); } static bool gpir_schedule_node(gpir_block *block, gpir_node *node) @@ -1190,13 +1211,15 @@ static bool gpir_schedule_node(gpir_block *block, gpir_node *node) if (!slots) return true; + if (lima_shader_debug_gp) + gpir_print_pre_schedule_node(node); + if (gpir_try_schedule_node(block, node)) return true; gpir_error("fail to schedule node %s %d\n", gpir_op_infos[node->op].name, node->index); - gpir_print_failed_node(node); gpir_instr_print_prog(block->comp); return false; } |