diff options
author | Rhys Perry <[email protected]> | 2019-12-11 15:54:18 +0000 |
---|---|---|
committer | Rhys Perry <[email protected]> | 2020-01-13 13:26:43 +0000 |
commit | 46fb341b8d719426c843138595949d16bf1b7dc4 (patch) | |
tree | 09673f84bf46284d4d17e7975554b8ae8e9665a0 | |
parent | 7ce244b7d1b22023a43c7ca4bb8bac30c699147c (diff) |
aco: handle omod successors with the constant in the first operand
No pipeline-db changes
Signed-off-by: Rhys Perry <[email protected]>
Reviewed-by: Daniel Schürmann <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3081>
-rw-r--r-- | src/amd/compiler/aco_optimizer.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 6b46cb44494..58c5704edba 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -1928,18 +1928,20 @@ bool apply_omod_clamp(opt_ctx &ctx, Block& block, aco_ptr<Instruction>& instr) { /* check if we could apply omod on predecessor */ if (instr->opcode == aco_opcode::v_mul_f32) { - if (instr->operands[1].isTemp() && ctx.info[instr->operands[1].tempId()].is_omod_success()) { - + bool op0 = instr->operands[0].isTemp() && ctx.info[instr->operands[0].tempId()].is_omod_success(); + bool op1 = instr->operands[1].isTemp() && ctx.info[instr->operands[1].tempId()].is_omod_success(); + if (op0 || op1) { + unsigned idx = op0 ? 0 : 1; /* omod was successfully applied */ /* if the omod instruction is v_mad, we also have to change the original add */ - if (ctx.info[instr->operands[1].tempId()].is_mad()) { - Instruction* add_instr = ctx.mad_infos[ctx.info[instr->operands[1].tempId()].val].add_instr.get(); + if (ctx.info[instr->operands[idx].tempId()].is_mad()) { + Instruction* add_instr = ctx.mad_infos[ctx.info[instr->operands[idx].tempId()].val].add_instr.get(); if (ctx.info[instr->definitions[0].tempId()].is_clamp()) static_cast<VOP3A_instruction*>(add_instr)->clamp = true; add_instr->definitions[0] = instr->definitions[0]; } - Instruction* omod_instr = ctx.info[instr->operands[1].tempId()].instr; + Instruction* omod_instr = ctx.info[instr->operands[idx].tempId()].instr; /* check if we have an additional clamp modifier */ if (ctx.info[instr->definitions[0].tempId()].is_clamp() && ctx.uses[instr->definitions[0].tempId()] == 1) { static_cast<VOP3A_instruction*>(omod_instr)->clamp = true; @@ -1949,7 +1951,7 @@ bool apply_omod_clamp(opt_ctx &ctx, Block& block, aco_ptr<Instruction>& instr) omod_instr->definitions[0] = instr->definitions[0]; /* change the definition of instr to something unused, e.g. the original omod def */ - instr->definitions[0] = Definition(instr->operands[1].getTemp()); + instr->definitions[0] = Definition(instr->operands[idx].getTemp()); ctx.uses[instr->definitions[0].tempId()] = 0; return true; } |