From: Jason Ekstrand Date: Tue, 20 Dec 2016 05:29:51 +0000 (-0800) Subject: nir/algebraic: Add optimizations for "a == a && a CMP b" X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d55835b8bdf031ef3c254a9b7ec1776ad348582b;p=mesa.git nir/algebraic: Add optimizations for "a == a && a CMP b" This sequence shows up The Talos Principal, at least under Vulkan, and prevents loop analysis from properly computing trip counts in a few loops. Reviewed-by: Ian Romanick --- diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 698ac673658..ff10d701f5e 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -464,6 +464,14 @@ def bitfield_reverse(u): optimizations += [(bitfield_reverse('x@32'), ('bitfield_reverse', 'x'))] +# For any float comparison operation, "cmp", if you have "a == a && a cmp b" +# then the "a == a" is redundant because it's equivalent to "a is not NaN" +# and, if a is a NaN then the second comparison will fail anyway. +for op in ['flt', 'fge', 'feq']: + optimizations += [ + (('iand', ('feq', a, a), (op, a, b)), (op, a, b)), + (('iand', ('feq', a, a), (op, b, a)), (op, b, a)), + ] # Add optimizations to handle the case where the result of a ternary is # compared to a constant. This way we can take things like