aco: Treat s_setprio as a scheduling barrier.
authorTimur Kristóf <timur.kristof@gmail.com>
Wed, 1 Apr 2020 13:38:43 +0000 (15:38 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 7 Apr 2020 11:29:35 +0000 (11:29 +0000)
We want to execute instructions after s_setprio in the given
priority, so we must prevent the scheduler from scheduling beyond
s_setprio, otherwise some instructions could be executed in a
different priority.

Rename hazard_fail_memtime to hazard_fail_unreorderable and include
s_setprio in the list of unreorderable opcodes.

Signed-off-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3576>

src/amd/compiler/aco_scheduler.cpp

index 41ca32c862585772ded7837525b8d5af3d2c40ed..d7cf90be1899727503866ee01e53cb380c382007 100644 (file)
@@ -460,7 +460,7 @@ enum HazardResult {
    /* Must stop at these failures. The hazard query code doesn't consider them
     * when added. */
    hazard_fail_exec,
-   hazard_fail_memtime,
+   hazard_fail_unreorderable,
 };
 
 HazardResult perform_hazard_query(hazard_query *query, Instruction *instr)
@@ -478,9 +478,11 @@ HazardResult perform_hazard_query(hazard_query *query, Instruction *instr)
    if (instr->format == Format::EXP)
       return hazard_fail_export;
 
-   /* don't move s_memtime/s_memrealtime */
-   if (instr->opcode == aco_opcode::s_memtime || instr->opcode == aco_opcode::s_memrealtime)
-      return hazard_fail_memtime;
+   /* don't move non-reorderable instructions */
+   if (instr->opcode == aco_opcode::s_memtime ||
+       instr->opcode == aco_opcode::s_memrealtime ||
+       instr->opcode == aco_opcode::s_setprio)
+      return hazard_fail_unreorderable;
 
    if (query->barrier_interaction && (query->barrier_interaction & parse_barrier(instr)))
       return hazard_fail_barrier;
@@ -795,7 +797,7 @@ void schedule_position_export(sched_ctx& ctx, Block* block,
          break;
 
       HazardResult haz = perform_hazard_query(&hq, candidate.get());
-      if (haz == hazard_fail_exec || haz == hazard_fail_memtime)
+      if (haz == hazard_fail_exec || haz == hazard_fail_unreorderable)
          break;
 
       if (haz != hazard_success) {