From d272a6e2619f3f59bdf9e83ac87fc27ae953694c Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Thu, 20 Feb 2025 10:43:20 +0100 Subject: [PATCH] nir/opt_algebraic: optimize d3d a ? b : 0 Foz-DB Navi21: Totals from 3466 (4.34% of 79789) affected shaders: MaxWaves: 73163 -> 73161 (-0.00%); split: +0.02%, -0.02% Instrs: 3993862 -> 3987633 (-0.16%); split: -0.19%, +0.04% CodeSize: 21747420 -> 21725620 (-0.10%); split: -0.15%, +0.05% VGPRs: 190736 -> 190728 (-0.00%); split: -0.04%, +0.03% SpillSGPRs: 489 -> 478 (-2.25%); split: -2.86%, +0.61% Latency: 48169718 -> 48159068 (-0.02%); split: -0.05%, +0.02% InvThroughput: 12132999 -> 12128721 (-0.04%); split: -0.05%, +0.01% VClause: 78063 -> 78052 (-0.01%); split: -0.09%, +0.08% SClause: 109095 -> 108996 (-0.09%); split: -0.13%, +0.04% Copies: 265784 -> 264530 (-0.47%); split: -0.72%, +0.25% Branches: 84533 -> 84553 (+0.02%) PreSGPRs: 172577 -> 172531 (-0.03%); split: -0.19%, +0.16% PreVGPRs: 165776 -> 165825 (+0.03%); split: -0.06%, +0.09% VALU: 2851544 -> 2850426 (-0.04%); split: -0.08%, +0.04% SALU: 413543 -> 408408 (-1.24%); split: -1.45%, +0.21% VMEM: 139890 -> 139887 (-0.00%) Reviewed-by: Ian Romanick Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_opt_algebraic.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 8316ef6f482..c3f22aa0c95 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -487,7 +487,7 @@ optimizations.extend([ (('~ffma@64', a, b, c), ('fadd', ('fmul', a, b), c), 'options->fuse_ffma64'), (('~ffmaz', a, b, c), ('fadd', ('fmulz', a, b), c), 'options->fuse_ffma32'), - (('~fmul', ('fadd', ('iand', ('ineg', ('b2i', 'a@bool')), ('fmul', b, c)), '#d'), '#e'), + (('~fmul', ('fadd', ('bcsel', a, ('fmul', b, c), 0), '#d'), '#e'), ('bcsel', a, ('fmul', ('fadd', ('fmul', b, c), d), e), ('fmul', d, e))), (('fdph', a, b), ('fdot4', ('vec4', 'a.x', 'a.y', 'a.z', 1.0), b), 'options->lower_fdph'), @@ -1473,10 +1473,12 @@ for s in [8, 16, 32, 64]: ]) optimizations.extend([ + (('iand', ('ineg', ('b2i', 'a@1')), b), + ('bcsel', a, b, 0)), + (('ior', ('ineg', ('b2i','a@1')), ('ineg', ('b2i', 'b@1'))), + ('ineg', ('b2i', ('ior', a, b)))), (('ige', ('ineg', ('b2i', 'a@1')), 0), ('inot', a)), (('ilt', ('ineg', ('b2i', 'a@1')), 0), a), - (('iand', ('ineg', ('b2i', a)), 1.0), ('b2f', a)), - (('iand', ('ineg', ('b2i', a)), 1), ('b2i', a)), (('bcsel', a, ('b2i', 'b@1'), ('b2i', 'c@1')), ('b2i', ('bcsel', a, b, c))), (('bcsel', a, ('b2i', 'b@1'), 0), ('b2i', ('bcsel', a, b, False))), (('bcsel', a, ('b2i', 'b@1'), 1), ('b2i', ('bcsel', a, b, True))), @@ -1510,12 +1512,6 @@ for op in ('ior', 'iand', 'ixor'): (('iand', (op, ('b2i', 'a@1'), ('ineg', ('b2i', 'b@1'))), 1), ('b2i', (op, a, b)) ), ]) -# One extra rule for iand. Since one of the sources is missing ineg, the -# final result can only be 0 or 1. Omit the final ineg. -optimizations.extend([ - (('iand', ('ineg', ('b2i', 'a@1')), ('b2i', 'b@1')), ('b2i', ('iand', a, b))) -]) - optimizations.extend([ (('feq', ('seq', a, b), 1.0), ('feq', a, b)), (('feq', ('sne', a, b), 1.0), ('fneu', a, b)),