nir/algebraic: better propagate constants up fadd chains
Make the optimization create more mad-friendly code if the order of the fadd's operands is unlucky. fossil-db (Navi): Totals from 9259 (8.07% of 114665) affected shaders: SGPRs: 615991 -> 616191 (+0.03%); split: -0.05%, +0.08% VGPRs: 442184 -> 443568 (+0.31%); split: -0.10%, +0.41% CodeSize: 32674876 -> 32625572 (-0.15%); split: -0.17%, +0.02% MaxWaves: 108560 -> 108152 (-0.38%); split: +0.07%, -0.44% Instrs: 6126473 -> 6120463 (-0.10%); split: -0.13%, +0.03% Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5631>
This commit is contained in:
@@ -21,7 +21,7 @@ traces:
|
||||
- path: gputest/pixmark-piano.trace
|
||||
expectations:
|
||||
- device: gl-virgl
|
||||
checksum: 43b2c4db0d6810cca945071b9a645561
|
||||
checksum: 8293e59b818715ddf1c23e9f60b17851
|
||||
- path: gputest/triangle.trace
|
||||
expectations:
|
||||
- device: gl-virgl
|
||||
|
@@ -1241,6 +1241,8 @@ optimizations.extend([
|
||||
# Propagate constants up multiplication chains
|
||||
(('~fmul(is_used_once)', ('fmul(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c'), ('fmul', ('fmul', a, c), b)),
|
||||
(('imul(is_used_once)', ('imul(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c'), ('imul', ('imul', a, c), b)),
|
||||
# Prefer moving out a multiplication for more MAD/FMA-friendly code
|
||||
(('~fadd(is_used_once)', ('fadd(is_used_once)', 'a(is_not_const)', 'b(is_fmul)'), '#c'), ('fadd', ('fadd', a, c), b)),
|
||||
(('~fadd(is_used_once)', ('fadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c'), ('fadd', ('fadd', a, c), b)),
|
||||
(('iadd(is_used_once)', ('iadd(is_used_once)', 'a(is_not_const)', 'b(is_not_const)'), '#c'), ('iadd', ('iadd', a, c), b)),
|
||||
|
||||
|
@@ -225,6 +225,22 @@ is_not_fmul(struct hash_table *ht, nir_alu_instr *instr, unsigned src,
|
||||
return src_alu->op != nir_op_fmul;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
is_fmul(struct hash_table *ht, nir_alu_instr *instr, unsigned src,
|
||||
UNUSED unsigned num_components, UNUSED const uint8_t *swizzle)
|
||||
{
|
||||
nir_alu_instr *src_alu =
|
||||
nir_src_as_alu_instr(instr->src[src].src);
|
||||
|
||||
if (src_alu == NULL)
|
||||
return false;
|
||||
|
||||
if (src_alu->op == nir_op_fneg)
|
||||
return is_fmul(ht, src_alu, 0, 0, NULL);
|
||||
|
||||
return src_alu->op == nir_op_fmul;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
is_fsign(nir_alu_instr *instr, unsigned src,
|
||||
UNUSED unsigned num_components, UNUSED const uint8_t *swizzle)
|
||||
|
Reference in New Issue
Block a user