gallivm/nir: Call nir_lower_bool_to_int32 after nir_opt_algebraic_late

All of the opcodes in nir_opt_algebraic_late are the unsized (1-bit)
versions.  If the lowering to int32 happens first, many of the
optimizations and lowerings won't happen.

Of particular importance is the lowering of fisfinite.  If a shader
happens to contain fisfinite of an fp16 value, it will assert later
during compliation.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Fixes: 78b4e417d4 ("gallivm: handle fisfinite/fisnormal")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14942>
This commit is contained in:
Ian Romanick 2022-02-08 17:53:02 -08:00 committed by Marge Bot
parent d633eace3f
commit e3cbc328e0

View file

@ -733,8 +733,7 @@ static LLVMValueRef do_alu_action(struct lp_build_nir_context *bld_base,
break;
}
case nir_op_fisfinite32:
result = lp_build_isfinite(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
break;
unreachable("Should have been lowered in nir_opt_algebraic_late.");
case nir_op_flog2:
result = lp_build_log2_safe(get_flt_bld(bld_base, src_bit_size[0]), src[0]);
break;
@ -2479,7 +2478,6 @@ void lp_build_opt_nir(struct nir_shader *nir)
NIR_PASS_V(nir, nir_lower_subgroups, &subgroups_options);
} while (progress);
nir_lower_bool_to_int32(nir);
do {
progress = false;
@ -2490,4 +2488,9 @@ void lp_build_opt_nir(struct nir_shader *nir)
NIR_PASS_V(nir, nir_opt_cse);
}
} while (progress);
if (nir_lower_bool_to_int32(nir)) {
NIR_PASS_V(nir, nir_copy_prop);
NIR_PASS_V(nir, nir_opt_dce);
}
}