aco: add aco_print_program() flags to print live_out and register demand
authorRhys Perry <pendingchaos02@gmail.com>
Mon, 15 Mar 2021 14:15:29 +0000 (14:15 +0000)
committerMarge Bot <eric+marge@anholt.net>
Fri, 19 Mar 2021 11:27:05 +0000 (11:27 +0000)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9599>

src/amd/compiler/aco_ir.h
src/amd/compiler/aco_print_ir.cpp

index 930f718..8635c72 100644 (file)
@@ -2015,11 +2015,13 @@ enum print_flags {
    print_no_ssa = 0x1,
    print_perf_info = 0x2,
    print_kill = 0x4,
+   print_live_vars = 0x8,
 };
 
 void aco_print_operand(const Operand *operand, FILE *output, unsigned flags=0);
 void aco_print_instr(const Instruction *instr, FILE *output, unsigned flags=0);
 void aco_print_program(const Program *program, FILE *output, unsigned flags=0);
+void aco_print_program(const Program *program, FILE *output, const live& live_vars, unsigned flags=0);
 
 void _aco_perfwarn(Program *program, const char *file, unsigned line,
                    const char *fmt, ...);
index 743dc0f..ba2925e 100644 (file)
@@ -865,7 +865,7 @@ static void print_stage(Stage stage, FILE *output)
    fprintf(output, "\n");
 }
 
-void aco_print_block(const Block* block, FILE *output, unsigned flags)
+void aco_print_block(const Block* block, FILE *output, unsigned flags, const live& live_vars)
 {
    fprintf(output, "BB%d\n", block->index);
    fprintf(output, "/* logical preds: ");
@@ -877,22 +877,39 @@ void aco_print_block(const Block* block, FILE *output, unsigned flags)
    fprintf(output, "/ kind: ");
    print_block_kind(block->kind, output);
    fprintf(output, "*/\n");
+
+   if (flags & print_live_vars) {
+      fprintf(output, "\tlive out:");
+      for (unsigned id : live_vars.live_out[block->index])
+         fprintf(output, " %%%d", id);
+      fprintf(output, "\n");
+
+      RegisterDemand demand = block->register_demand;
+      fprintf(output, "\tdemand: %u vgpr, %u sgpr\n", demand.vgpr, demand.sgpr);
+   }
+
+   unsigned index = 0;
    for (auto const& instr : block->instructions) {
       fprintf(output, "\t");
+      if (flags & print_live_vars) {
+         RegisterDemand demand = live_vars.register_demand[block->index][index];
+         fprintf(output, "(%3u vgpr, %3u sgpr)   ", demand.vgpr, demand.sgpr);
+      }
       if (flags & print_perf_info)
          fprintf(output, "(%3u clk)   ", instr->pass_flags);
 
       aco_print_instr(instr.get(), output, flags);
       fprintf(output, "\n");
+      index++;
    }
 }
 
-void aco_print_program(const Program *program, FILE *output, unsigned flags)
+void aco_print_program(const Program *program, FILE *output, const live& live_vars, unsigned flags)
 {
    print_stage(program->stage, output);
 
    for (Block const& block : program->blocks)
-      aco_print_block(&block, output, flags);
+      aco_print_block(&block, output, flags, live_vars);
 
    if (program->constant_data.size()) {
       fprintf(output, "\n/* constant data */\n");
@@ -912,4 +929,9 @@ void aco_print_program(const Program *program, FILE *output, unsigned flags)
    fprintf(output, "\n");
 }
 
+void aco_print_program(const Program *program, FILE *output, unsigned flags)
+{
+   aco_print_program(program, output, live(), flags);
+}
+
 }