[Mesa-dev] [PATCH 09/11] nir/algebraic: Recognize open-coded copysign(a, 1.0)

Ian Romanick idr at freedesktop.org
Mon Sep 10 23:29:12 UTC 2018


From: Ian Romanick <ian.d.romanick at intel.com>

All of the affected shaders are in Mad Max.  The inner part of the
pattern is itself an open-coded sign(a).  I tried using that as a
pattern, but the results were not good.  A bunch of shaders were helped
for instructions, but overall cycles, spill, and fills were hurt.

All Gen7+ platforms had similar results. (Skylake shown)
total instructions in shared programs: 15090997 -> 15090929 (<.01%)
instructions in affected programs: 6157 -> 6089 (-1.10%)
helped: 17
HURT: 0
helped stats (abs) min: 4 max: 4 x̄: 4.00 x̃: 4
helped stats (rel) min: 1.01% max: 2.16% x̄: 1.14% x̃: 1.06%
95% mean confidence interval for instructions value: -4.00 -4.00
95% mean confidence interval for instructions %-change: -1.29% -1.00%
Instructions are helped.

total cycles in shared programs: 565827580 -> 565826044 (<.01%)
cycles in affected programs: 32387 -> 30851 (-4.74%)
helped: 17
HURT: 0
helped stats (abs) min: 21 max: 213 x̄: 90.35 x̃: 50
helped stats (rel) min: 1.37% max: 21.69% x̄: 5.10% x̃: 2.60%
95% mean confidence interval for cycles value: -127.73 -52.97
95% mean confidence interval for cycles %-change: -7.78% -2.41%
Cycles are helped.

No changes on any Gen6 or earlier platforms.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/compiler/nir/nir_opt_algebraic.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 422a8794d38..6d963cede93 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -372,6 +372,12 @@ optimizations = [
    (('iand', ('uge(is_used_once)', a, b), ('uge', a, c)), ('uge', a, ('umax', b, c))),
    (('iand', ('uge(is_used_once)', a, c), ('uge', b, c)), ('uge', ('umin', a, b), c)),
 
+   # The (i2f32, ...) part is an open-coded fsign.  When that is combined with
+   # the bcsel, it's basically copysign(a, 1.0).  There is no copysign in NIR,
+   # so emit an open-coded version of that.
+   (('bcsel at 32', ('feq', a, 0.0), 1.0, ('i2f32', ('iadd', ('ineg', ('flt', 0.0, 'a at 32')), ('flt', 'a at 32', 0.0)))),
+    ('ior', 0x3f800000, ('iand', a, 0x80000000))),
+
    (('ior', 'a at bool', ('ieq', a, False)), True),
    (('ior', 'a at bool', ('inot', a)), True),
 
-- 
2.14.4



More information about the mesa-dev mailing list