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@intel.com>
This commit is contained in:
Jason Ekstrand 2018-10-10 22:36:52 -05:00
parent 0e0dc596a2
commit d7e0d47b9d
1 changed files with 17 additions and 0 deletions

View File

@ -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: