X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_opt_algebraic.py;h=472db765026cab36a0f095933f0b4a5f35ea80a7;hb=a18c4ee7b07cb0c78b7d93005cc76eded4e8001c;hp=7d9775950a4d596d519df681ce6f86e605583173;hpb=4e3d69ad07d9c439fc99b7c1b1e999ce556d260f;p=mesa.git diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 7d9775950a4..472db765026 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -629,6 +629,17 @@ optimizations.extend([ (('iand', ('ieq', 'a@32', 0), ('ieq', 'b@32', 0)), ('ieq', ('ior', a, b), 0), '!options->lower_bitops'), (('ior', ('ine', 'a@32', 0), ('ine', 'b@32', 0)), ('ine', ('ior', a, b), 0), '!options->lower_bitops'), + # This pattern occurs coutresy of __flt64_nonnan in the soft-fp64 code. + # The first part of the iand comes from the !__feq64_nonnan. + # + # The second pattern is a reformulation of the first based on the relation + # (a == 0 || y == 0) <=> umin(a, y) == 0, where b in the first equation + # happens to be y == 0. + (('iand', ('inot', ('iand', ('ior', ('ieq', a, 0), b), c)), ('ilt', a, 0)), + ('iand', ('inot', ('iand', b , c)), ('ilt', a, 0))), + (('iand', ('inot', ('iand', ('ieq', ('umin', a, b), 0), c)), ('ilt', a, 0)), + ('iand', ('inot', ('iand', ('ieq', b , 0), c)), ('ilt', a, 0))), + # These patterns can result when (a < b || a < c) => (a < min(b, c)) # transformations occur before constant propagation and loop-unrolling. (('~flt', a, ('fmax', b, a)), ('flt', a, b)), @@ -776,6 +787,7 @@ optimizations.extend([ (('~fexp2', ('fmul', ('flog2', a), b)), ('fpow', a, b), '!options->lower_fpow'), # 2^(lg2(a)*b) = a^b (('~fexp2', ('fadd', ('fmul', ('flog2', a), b), ('fmul', ('flog2', c), d))), ('~fmul', ('fpow', a, b), ('fpow', c, d)), '!options->lower_fpow'), # 2^(lg2(a) * b + lg2(c) + d) = a^b * c^d + (('~fexp2', ('fmul', ('flog2', a), 0.5)), ('fsqrt', a)), (('~fexp2', ('fmul', ('flog2', a), 2.0)), ('fmul', a, a)), (('~fexp2', ('fmul', ('flog2', a), 4.0)), ('fmul', ('fmul', a, a), ('fmul', a, a))), (('~fpow', a, 1.0), a), @@ -1347,7 +1359,7 @@ for x, y in itertools.product(['f', 'u', 'i'], ['f', 'u', 'i']): optimizations.append(((x2yN, (b2x, a)), (b2y, a))) # Optimize away x2xN(a@N) -for t in ['int', 'uint', 'float']: +for t in ['int', 'uint', 'float', 'bool']: for N in type_sizes(t): x2xN = '{0}2{0}{1}'.format(t[0], N) aN = 'a@{0}'.format(N) @@ -1388,6 +1400,15 @@ for N, M in itertools.product(type_sizes('uint'), type_sizes('uint')): # The N == M case is handled by other optimizations pass +# Downcast operations should be able to see through pack +for t in ['i', 'u']: + for N in [8, 16, 32]: + x2xN = '{0}2{0}{1}'.format(t, N) + optimizations += [ + ((x2xN, ('pack_64_2x32_split', a, b)), (x2xN, a)), + ((x2xN, ('pack_64_2x32_split', a, b)), (x2xN, a)), + ] + # Optimize comparisons with up-casts for t in ['int', 'uint', 'float']: for N, M in itertools.product(type_sizes(t), repeat=2):