aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler/nir
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-10-10 22:36:52 -0500
committerJason Ekstrand <[email protected]>2018-10-11 15:21:19 -0500
commitd7e0d47b9de3e759d5ed7b299fa7f4e7cbd8760e (patch)
tree5836308d807c3f1cf157d5847ce7c757558ca997 /src/compiler/nir
parent0e0dc596a2c008c32def103e175fcd5b7116f38f (diff)
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 <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r--src/compiler/nir/nir_opt_algebraic.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 422a8794d38..cc747250ba5 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: