aco: skip unnecessary compiler pass for the trap handler program
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 21 Aug 2020 09:33:22 +0000 (11:33 +0200)
committerMarge Bot <eric+marge@anholt.net>
Mon, 24 Aug 2020 11:08:24 +0000 (11:08 +0000)
The shader is written by hands with assigned registers, so most of
the pass are unnecessary.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6384>

src/amd/compiler/aco_interface.cpp

index 96a968d376a2dfdeb5bbb1d9fb5b59d4779892ef..5d402495ae545fa9ecbf79a5887c5eaad29f14d6 100644 (file)
@@ -79,23 +79,26 @@ void aco_compile_shader(unsigned shader_count,
       aco_print_program(program.get(), stderr);
    }
 
-   /* Phi lowering */
-   aco::lower_phis(program.get());
-   aco::dominator_tree(program.get());
-   validate(program.get());
-
-   /* Optimization */
-   aco::value_numbering(program.get());
-   aco::optimize(program.get());
-
-   /* cleanup and exec mask handling */
-   aco::setup_reduce_temp(program.get());
-   aco::insert_exec_mask(program.get());
-   validate(program.get());
-
-   /* spilling and scheduling */
-   aco::live live_vars = aco::live_var_analysis(program.get(), args->options);
-   aco::spill(program.get(), live_vars, args->options);
+   aco::live live_vars;
+   if (!args->is_trap_handler_shader) {
+      /* Phi lowering */
+      aco::lower_phis(program.get());
+      aco::dominator_tree(program.get());
+      validate(program.get());
+
+      /* Optimization */
+      aco::value_numbering(program.get());
+      aco::optimize(program.get());
+
+      /* cleanup and exec mask handling */
+      aco::setup_reduce_temp(program.get());
+      aco::insert_exec_mask(program.get());
+      validate(program.get());
+
+      /* spilling and scheduling */
+      live_vars = aco::live_var_analysis(program.get(), args->options);
+      aco::spill(program.get(), live_vars, args->options);
+   }
 
    std::string llvm_ir;
    if (args->options->record_ir) {
@@ -114,26 +117,30 @@ void aco_compile_shader(unsigned shader_count,
 
    if (program->collect_statistics)
       aco::collect_presched_stats(program.get());
-   aco::schedule_program(program.get(), live_vars);
-   validate(program.get());
 
-   /* Register Allocation */
-   aco::register_allocation(program.get(), live_vars.live_out);
-   if (args->options->dump_shader) {
-      std::cerr << "After RA:\n";
-      aco_print_program(program.get(), stderr);
-   }
+   if (!args->is_trap_handler_shader) {
+      aco::schedule_program(program.get(), live_vars);
+      validate(program.get());
 
-   if (aco::validate_ra(program.get(), args->options)) {
-      std::cerr << "Program after RA validation failure:\n";
-      aco_print_program(program.get(), stderr);
-      abort();
-   }
+      /* Register Allocation */
+      aco::register_allocation(program.get(), live_vars.live_out);
+      if (args->options->dump_shader) {
+         std::cerr << "After RA:\n";
+         aco_print_program(program.get(), stderr);
+      }
+
+      if (aco::validate_ra(program.get(), args->options)) {
+         std::cerr << "Program after RA validation failure:\n";
+         aco_print_program(program.get(), stderr);
+         abort();
+      }
+
+      validate(program.get());
 
-   validate(program.get());
+      aco::ssa_elimination(program.get());
+   }
 
    /* Lower to HW Instructions */
-   aco::ssa_elimination(program.get());
    aco::lower_to_hw_instr(program.get());
 
    /* Insert Waitcnt */