Mesa (main): aco: optimize abs(mul(a, b))
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jan 31 14:12:33 UTC 2022
Module: Mesa
Branch: main
Commit: 1804c21fb570285d90709010b746ed6812b42aa6
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1804c21fb570285d90709010b746ed6812b42aa6
Author: Rhys Perry <pendingchaos02 at gmail.com>
Date: Fri Jan 28 13:47:16 2022 +0000
aco: optimize abs(mul(a, b))
fossil-db (Sienna Cichlid):
Totals from 18 (0.01% of 134913) affected shaders:
CodeSize: 173924 -> 173852 (-0.04%)
Instrs: 33864 -> 33846 (-0.05%)
Latency: 122233 -> 122211 (-0.02%)
InvThroughput: 22482 -> 22462 (-0.09%)
Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
Reviewed-by: Daniel Schürmann <daniel at schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14773>
---
src/amd/compiler/aco_optimizer.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp
index 6f08dbfe930..537f3d4b1b9 100644
--- a/src/amd/compiler/aco_optimizer.cpp
+++ b/src/amd/compiler/aco_optimizer.cpp
@@ -3482,8 +3482,8 @@ combine_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
* The various comparison optimizations also currently only work with 32-bit
* floats. */
- /* neg(mul(a, b)) -> mul(neg(a), b) */
- if (ctx.info[instr->definitions[0].tempId()].is_neg() &&
+ /* neg(mul(a, b)) -> mul(neg(a), b), abs(mul(a, b)) -> mul(abs(a), abs(b)) */
+ if ((ctx.info[instr->definitions[0].tempId()].label & (label_neg | label_abs)) &&
ctx.uses[instr->operands[1].tempId()] == 1) {
Temp val = ctx.info[instr->definitions[0].tempId()].temp;
@@ -3502,10 +3502,10 @@ combine_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
ctx.fp_mode.preserve_signed_zero_inf_nan32)
return;
- /* convert to mul(neg(a), b) */
+ /* convert to mul(neg(a), b), mul(abs(a), abs(b)) or mul(neg(abs(a)), abs(b)) */
ctx.uses[mul_instr->definitions[0].tempId()]--;
Definition def = instr->definitions[0];
- /* neg(abs(mul(a, b))) -> mul(neg(abs(a)), abs(b)) */
+ bool is_neg = ctx.info[instr->definitions[0].tempId()].is_neg();
bool is_abs = ctx.info[instr->definitions[0].tempId()].is_abs();
instr.reset(
create_instruction<VOP3_instruction>(mul_instr->opcode, asVOP3(Format::VOP2), 2, 1));
@@ -3525,7 +3525,7 @@ combine_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
new_mul.neg[0] = new_mul.neg[1] = false;
new_mul.abs[0] = new_mul.abs[1] = true;
}
- new_mul.neg[0] ^= true;
+ new_mul.neg[0] ^= is_neg;
new_mul.clamp = false;
ctx.info[instr->definitions[0].tempId()].set_mul(instr.get());
More information about the mesa-commit
mailing list