aco: fix scheduling with s_memtime/s_memrealtime
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 10 Oct 2019 16:04:06 +0000 (17:04 +0100)
committerRhys Perry <pendingchaos02@gmail.com>
Wed, 16 Oct 2019 14:31:19 +0000 (15:31 +0100)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
src/amd/compiler/aco_scheduler.cpp

index 09076a9a71f545197789165fd75180f6bae85c88..67264fcf14f0313584837c28b4d8aee97337dce3 100644 (file)
@@ -110,6 +110,10 @@ bool can_move_instr(aco_ptr<Instruction>& instr, Instruction* current, int movin
    if (instr->format == Format::EXP)
       return false;
 
+   /* don't move s_memtime/s_memrealtime */
+   if (instr->opcode == aco_opcode::s_memtime || instr->opcode == aco_opcode::s_memrealtime)
+      return false;
+
    /* handle barriers */
 
    /* TODO: instead of stopping, maybe try to move the barriers and any
@@ -191,6 +195,10 @@ void schedule_SMEM(sched_ctx& ctx, Block* block,
    int16_t k = 0;
    bool can_reorder_cur = can_reorder(current, false);
 
+   /* don't move s_memtime/s_memrealtime */
+   if (current->opcode == aco_opcode::s_memtime || current->opcode == aco_opcode::s_memrealtime)
+      return;
+
    /* create the initial set of values which current depends on */
    std::fill(ctx.depends_on.begin(), ctx.depends_on.end(), false);
    for (const Operand& op : current->operands) {