This sequence shows up The Talos Principal, at least under Vulkan,
and prevents loop analysis from properly computing trip counts in a
few loops.
---
 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 698ac67..cc70ad5 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 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', 'fne']:
+   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.5.0.400.gff86faf

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to