Mesa (master): aco: check if SALU instructions are predeceeded by exec when calculating WQM needs
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Nov 14 17:12:07 UTC 2019
Module: Mesa
Branch: master
Commit: 8657eede8aec88537d64bbd86e1401018992acf1
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8657eede8aec88537d64bbd86e1401018992acf1
Author: Daniel Schürmann <daniel at schuermann.dev>
Date: Mon Nov 11 16:21:51 2019 +0100
aco: check if SALU instructions are predeceeded by exec when calculating WQM needs
Reviewed-By: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
---
src/amd/compiler/aco_insert_NOPs.cpp | 9 +--------
src/amd/compiler/aco_insert_exec_mask.cpp | 5 +++--
src/amd/compiler/aco_ir.h | 9 +++++++++
3 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/amd/compiler/aco_insert_NOPs.cpp b/src/amd/compiler/aco_insert_NOPs.cpp
index 2c69407b808..b0404300e0e 100644
--- a/src/amd/compiler/aco_insert_NOPs.cpp
+++ b/src/amd/compiler/aco_insert_NOPs.cpp
@@ -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)) {
diff --git a/src/amd/compiler/aco_insert_exec_mask.cpp b/src/amd/compiler/aco_insert_exec_mask.cpp
index 530faab2167..c2693608a1a 100644
--- a/src/amd/compiler/aco_insert_exec_mask.cpp
+++ b/src/amd/compiler/aco_insert_exec_mask.cpp
@@ -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;
diff --git a/src/amd/compiler/aco_ir.h b/src/amd/compiler/aco_ir.h
index 5b708c884e6..a6fe846c74d 100644
--- a/src/amd/compiler/aco_ir.h
+++ b/src/amd/compiler/aco_ir.h
@@ -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 {
More information about the mesa-commit
mailing list