nir: Add more matches for fmulz

In some cases after other passes, `(a == 0.0 ? 0 : b)` can be
turned into `(a != 0.0 ? b : 0)`, so let's match those cases too.

Also matching `min(abs(a), abs(b)) == 0.0 ? 0.0 : a * b`.

Signed-off-by: Karmjit Mahil <karmjit.mahil@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31479>
This commit is contained in:
Karmjit Mahil 2024-08-29 10:50:56 +02:00 committed by Marge Bot
parent c85168160e
commit 8d19ffef0a

View file

@ -337,6 +337,18 @@ optimizations = [
# (b==0.0 ? 0.0 : a) * (a==0.0 ? 0.0 : b) -> fmulz(a, b)
*add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('feq', b, 0.0), 0.0, 'ma'), ('bcsel', ignore_exact('feq', a, 0.0), 0.0, 'mb')),
('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}),
# (b!=0.0 ? a : 0.0) * (a==0.0 ? 0.0 : b) -> fmulz(a, b)
*add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('fneu', b, 0.0), 'ma', 0.0), ('bcsel', ignore_exact('feq', a, 0.0), 0.0, 'mb')),
('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}),
# (b!=0.0 ? a : 0.0) * (a!=0.0 ? b : 0.0) -> fmulz(a, b)
*add_fabs_fneg((('fmul@32(nsz)', ('bcsel', ignore_exact('fneu', b, 0.0), 'ma', 0.0), ('bcsel', ignore_exact('fneu', a, 0.0), 'mb', 0.0)),
('fmulz', 'ma', 'mb'), has_fmulz), {'ma' : a, 'mb' : b}),
# (min(abs(a), abs(b)) == 0.0 ? 0.0 : a * b) -> fmulz(a,b)
*add_fabs_fneg((('bcsel', ('feq', ('fmin', ('fabs', a), ('fabs', b)), 0.0), 0.0, ('fmul@32', 'ma', 'mb')),
('fmulz', 'ma', 'mb'), has_fmulz), {'ma': a, 'mb': b}),
# a * (a == 0.0 ? 0.0 : b(is_non_const_zero))
*add_fabs_fneg((('fmul@32(nsz)', 'ma', ('bcsel', ignore_exact('feq', a, 0.0), 0.0, '#b(is_not_const_zero)')),
('fmulz', 'ma', b), has_fmulz), {'ma' : a}),