mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 21:50:12 +01:00
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:
parent
5ab1489ae6
commit
d8999bcdce
2 changed files with 13 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue