Skip to content

nir/algebraic: fold some nested comparisons with ball and bany

Italo Nicola requested to merge italove/mesa:nir_fold_all_any into master

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.

Edited by Italo Nicola

Merge request reports

Loading