nir/search: Add support for matching unknown constants

There are some algebraic transformations that we want to do but only if
certain things are constants.  For instance, we may want to replace
a * (b + c) with (a * b) + (a * c) as long as a and either b or c is constant.
While this generates more instructions, some of it will get constant
folded.

nir_algebraic.py doesn't handle this yet, but that's ok because the C
language will make sure that false is the default for now.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Jason Ekstrand 2015-01-22 14:15:27 -08:00
parent 5ab1489ae6
commit d8999bcdce
2 changed files with 13 additions and 0 deletions

View file

@ -78,6 +78,10 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
return true;
} else {
if (var->is_constant &&
instr->src[src].src.ssa->parent_instr->type != nir_instr_type_load_const)
return false;
state->variables_seen |= (1 << var->variable);
state->variables[var->variable].src = instr->src[src].src;
state->variables[var->variable].abs = false;
@ -236,6 +240,8 @@ construct_value(const nir_search_value *value, nir_alu_type type,
nir_alu_src val;
nir_alu_src_copy(&val, &state->variables[var->variable], mem_ctx);
assert(!var->is_constant);
return val;
}

View file

@ -47,6 +47,13 @@ typedef struct {
/** The variable index; Must be less than NIR_SEARCH_MAX_VARIABLES */
unsigned variable;
/** Indicates that the given variable must be a constant
*
* This is only alloed in search expressions and indicates that the
* given variable is only allowed to match constant values.
*/
bool is_constant;
} nir_search_variable;
typedef struct {