aco: check if SALU instructions are predeceeded by exec when calculating WQM needs
authorDaniel Schürmann <daniel@schuermann.dev>
Mon, 11 Nov 2019 15:21:51 +0000 (16:21 +0100)
committerTimur Kristóf <timur.kristof@gmail.com>
Thu, 14 Nov 2019 16:27:10 +0000 (17:27 +0100)
Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
src/amd/compiler/aco_insert_NOPs.cpp
src/amd/compiler/aco_insert_exec_mask.cpp
src/amd/compiler/aco_ir.h

index 2c69407b80806b2da32f6dabd879626882dc33e1..b0404300e0e48a5a208b1a645020c204c09bd909 100644 (file)
@@ -115,13 +115,6 @@ bool VALU_writes_sgpr(aco_ptr<Instruction>& instr)
    return false;
 }
 
-bool instr_reads_exec(const aco_ptr<Instruction>& instr)
-{
-   return std::any_of(instr->operands.begin(), instr->operands.end(), [](const Operand &op) -> bool {
-      return op.physReg() == exec_lo || op.physReg() == exec_hi;
-   });
-}
-
 bool instr_writes_exec(const aco_ptr<Instruction>& instr)
 {
    return std::any_of(instr->definitions.begin(), instr->definitions.end(), [](const Definition &def) -> bool {
@@ -445,7 +438,7 @@ void handle_instruction_gfx10(NOP_ctx_gfx10 &ctx, aco_ptr<Instruction>& instr,
    /* VcmpxExecWARHazard
     * Handle any VALU instruction writing the exec mask after it was read by a non-VALU instruction.
     */
-   if (!instr->isVALU() && instr_reads_exec(instr)) {
+   if (!instr->isVALU() && instr->reads_exec()) {
       ctx.has_nonVALU_exec_read = true;
    } else if (instr->isVALU()) {
       if (instr_writes_exec(instr)) {
index 530faab216756e664a604454fcc737ca81df98fc..c2693608a1a39c78baacbaf05da9b31b882d1662 100644 (file)
@@ -95,6 +95,8 @@ struct exec_ctx {
 };
 
 bool pred_by_exec_mask(aco_ptr<Instruction>& instr) {
+   if (instr->isSALU())
+      return instr->reads_exec();
    if (instr->format == Format::SMEM || instr->isSALU())
       return false;
    if (instr->format == Format::PSEUDO_BARRIER)
@@ -200,8 +202,7 @@ void get_block_needs(wqm_ctx &ctx, exec_ctx &exec_ctx, Block* block)
       ctx.wqm = false;
    }
 
-   for (int i = block->instructions.size() - 1; i >= 0; --i)
-   {
+   for (int i = block->instructions.size() - 1; i >= 0; --i) {
       aco_ptr<Instruction>& instr = block->instructions[i];
 
       WQMState needs = needs_exact(instr) ? Exact : Unspecified;
index 5b708c884e6c03361b337d9a0b706d5ef4edf3ed..a6fe846c74d031ed663448a2eb1525bd70b99e40 100644 (file)
@@ -616,6 +616,15 @@ struct Instruction {
    }
 
    constexpr bool usesModifiers() const noexcept;
+
+   constexpr bool reads_exec() const noexcept
+   {
+      for (const Operand& op : operands) {
+         if (op.isFixed() && op.physReg() == exec)
+            return true;
+      }
+      return false;
+   }
 };
 
 struct SOPK_instruction : public Instruction {