Mesa (master): nir: Add a bunch of b2[if] optimizations

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 11 20:21:37 UTC 2018


Module: Mesa
Branch: master
Commit: d7e0d47b9de3e759d5ed7b299fa7f4e7cbd8760e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d7e0d47b9de3e759d5ed7b299fa7f4e7cbd8760e

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Wed Oct 10 22:36:52 2018 -0500

nir: Add a bunch of b2[if] optimizations

The b2f and b2i conversions always produce zero or one which are both
representable in every type and size.  Since b2i and b2f support all bit
sizes, we can just get rid of the conversion opcode.

total instructions in shared programs: 15089335 -> 15084368 (-0.03%)
instructions in affected programs: 212564 -> 207597 (-2.34%)
helped: 896
HURT: 0

total cycles in shared programs: 369831123 -> 369826267 (<.01%)
cycles in affected programs: 2008647 -> 2003791 (-0.24%)
helped: 693
HURT: 216

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

---

 src/compiler/nir/nir_opt_algebraic.py | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 422a8794d3..cc747250ba 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -751,6 +751,23 @@ for left, right in itertools.combinations_with_replacement(invert.keys(), 2):
    optimizations.append((('inot', ('iand(is_used_once)', (left, a, b), (right, c, d))),
                          ('ior', (invert[left], a, b), (invert[right], c, d))))
 
+# Optimize x2yN(b2x(x)) -> b2y
+optimizations.append((('f2b', ('b2f', a)), a))
+optimizations.append((('i2b', ('b2i', a)), a))
+for x, y in itertools.product(['f', 'u', 'i'], ['f', 'u', 'i']):
+   if x != 'f' and y != 'f' and x != y:
+      continue
+
+   b2x = 'b2f' if x == 'f' else 'b2i'
+   b2y = 'b2f' if y == 'f' else 'b2i'
+
+   for N in [8, 16, 32, 64]:
+      if y == 'f' and N == 8:
+         continue
+
+      x2yN = '{}2{}{}'.format(x, y, N)
+      optimizations.append(((x2yN, (b2x, a)), (b2y, a)))
+
 def fexp2i(exp, bits):
    # We assume that exp is already in the right range.
    if bits == 32:




More information about the mesa-commit mailing list