mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-05 03:50:34 +02:00
aco: check if SALU instructions are predeceeded by exec when calculating WQM needs
Reviewed-By: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
This commit is contained in:
parent
ee9811a0bb
commit
8657eede8a
3 changed files with 13 additions and 10 deletions
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue