nir/search: Allow for matching variables based on types
This allows you to match on an unknown value but only if it is of a given type. 90% of the uses of this are for matching only booleans, but adding the generality of arbitrary types is no more complex. nir_algebraic.py doesn't handle this yet but that's ok because the C language will ensure that the default type on all variables is void. Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -82,6 +82,17 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
|||||||
instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const)
|
instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (var->type != nir_type_invalid) {
|
||||||
|
if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_alu)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
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)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
state->variables_seen |= (1 << var->variable);
|
state->variables_seen |= (1 << var->variable);
|
||||||
state->variables[var->variable].src = instr->src[src].src;
|
state->variables[var->variable].src = instr->src[src].src;
|
||||||
state->variables[var->variable].abs = false;
|
state->variables[var->variable].abs = false;
|
||||||
|
@@ -54,6 +54,18 @@ typedef struct {
|
|||||||
* given variable is only allowed to match constant values.
|
* given variable is only allowed to match constant values.
|
||||||
*/
|
*/
|
||||||
bool is_constant;
|
bool is_constant;
|
||||||
|
|
||||||
|
/** Indicates that the given variable must have a certain type
|
||||||
|
*
|
||||||
|
* This is only allowed in search expressions and indicates that the
|
||||||
|
* given variable is only allowed to match values that come from an ALU
|
||||||
|
* instruction with the given output type. A type of nir_type_void
|
||||||
|
* means it can match any type.
|
||||||
|
*
|
||||||
|
* Note: A variable that is both constant and has a non-void type will
|
||||||
|
* never match anything.
|
||||||
|
*/
|
||||||
|
nir_alu_type type;
|
||||||
} nir_search_variable;
|
} nir_search_variable;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Reference in New Issue
Block a user