nir: Allow nir_opt_algebraic to see booleanness through &&, ||, ^, !.
We have some useful optimizations to drop things like 'ine a, 0' on a boolean argument, but if 'a' came from logical operations on bools, it couldn't tell. These kinds of constructs appear as a result of TGSI->NIR quite frequently (at least with if flattening), so being a little more aggressive in detecting booleans can pay off. v2: Add ixor as a booleanness-preserving op (Suggestion by Connor). vc4 results: total instructions in shared programs: 40207 -> 39881 (-0.81%) instructions in affected programs: 6677 -> 6351 (-4.88%) Reviewed-by: Matt Turner <mattst88@gmail.com> (v1) Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
This commit is contained in:
parent
dc982f4a85
commit
8e1152cb33
|
@ -39,6 +39,33 @@ match_expression(const nir_search_expression *expr, nir_alu_instr *instr,
|
|||
|
||||
static const uint8_t identity_swizzle[] = { 0, 1, 2, 3 };
|
||||
|
||||
static bool alu_instr_is_bool(nir_alu_instr *instr);
|
||||
|
||||
static bool
|
||||
src_is_bool(nir_src src)
|
||||
{
|
||||
if (!src.is_ssa)
|
||||
return false;
|
||||
if (src.ssa->parent_instr->type != nir_instr_type_alu)
|
||||
return false;
|
||||
return alu_instr_is_bool((nir_alu_instr *)src.ssa->parent_instr);
|
||||
}
|
||||
|
||||
static bool
|
||||
alu_instr_is_bool(nir_alu_instr *instr)
|
||||
{
|
||||
switch (instr->op) {
|
||||
case nir_op_iand:
|
||||
case nir_op_ior:
|
||||
case nir_op_ixor:
|
||||
return src_is_bool(instr->src[0].src) && src_is_bool(instr->src[1].src);
|
||||
case nir_op_inot:
|
||||
return src_is_bool(instr->src[0].src);
|
||||
default:
|
||||
return nir_op_infos[instr->op].output_type == nir_type_bool;
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
||||
unsigned num_components, const uint8_t *swizzle,
|
||||
|
@ -89,7 +116,8 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
|||
nir_alu_instr *src_alu =
|
||||
nir_instr_as_alu(instr->src[src].src.ssa->parent_instr);
|
||||
|
||||
if (nir_op_infos[src_alu->op].output_type != var->type)
|
||||
if (nir_op_infos[src_alu->op].output_type != var->type &&
|
||||
!(var->type == nir_type_bool && alu_instr_is_bool(src_alu)))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue