nir/algebraic: fold some nested comparisons with ball and bany
Currently, builtin GLSL expressions such as all(equal(a, b))
produce NIR code similar to this:
vec4 32 ssa_0 = load_const (0xffffffff /* -nan */, 0xffffffff /* -nan */, 0xffffffff /* -nan */, 0xffffffff /* -nan */)
...
vec4 32 ssa_10 = intrinsic load_input (ssa_3) (1, 0, 34, 161) /* base=1 */ /* component=0 */ /* type=int32 */ /* location=33 slots=1 */ /* dummy_out1 */
vec4 32 ssa_11 = intrinsic load_input (ssa_3) (2, 0, 34, 162) /* base=2 */ /* component=0 */ /* type=int32 */ /* location=34 slots=1 */ /* dummy_out2 */
vec4 32 ssa_12 = ieq32 ssa_10, ssa_11
vec1 32 ssa_13 = b32all_iequal4 ssa_12, ssa_0
But the same expression when written as a == b
(with a
and b
being vectors) produces this NIR code:
vec4 32 ssa_9 = intrinsic load_input (ssa_2) (1, 0, 34, 161) /* base=1 */ /* component=0 */ /* type=int32 */ /* location=33 slots=1 */ /* dummy_out1 */
vec4 32 ssa_10 = intrinsic load_input (ssa_2) (2, 0, 34, 162) /* base=2 */ /* component=0 */ /* type=int32 */ /* location=34 slots=1 */ /* dummy_out2 */
vec1 32 ssa_11 = b32all_iequal4 ssa_9, ssa_10
This patch folds redundant ops like this.
Notice that we can't do this for expressions such as all(notEqual(a,b))
, because ball_inequal
is not a NIR opcode.