From d55835b8bdf031ef3c254a9b7ec1776ad348582b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 19 Dec 2016 21:29:51 -0800 Subject: [PATCH] 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 --- src/compiler/nir/nir_opt_algebraic.py | 8 ++++++++ 1 file changed, 8 insertions(+) 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 -- 2.30.2