nir/search: Only allow matching SSA values
This is more correct and should also be a tiny bit faster since we're just comparing pointers instead of calling nir_src_equal. Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com> Cc: "13.0" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
534ea2b5ba
commit
c472568b4e
|
@ -98,6 +98,16 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
||||||
{
|
{
|
||||||
uint8_t new_swizzle[4];
|
uint8_t new_swizzle[4];
|
||||||
|
|
||||||
|
/* Searching only works on SSA values because, if it's not SSA, we can't
|
||||||
|
* know if the value changed between one instance of that value in the
|
||||||
|
* expression and another. Also, the replace operation will place reads of
|
||||||
|
* that value right before the last instruction in the expression we're
|
||||||
|
* replacing so those reads will happen after the original reads and may
|
||||||
|
* not be valid if they're register reads.
|
||||||
|
*/
|
||||||
|
if (!instr->src[src].src.is_ssa)
|
||||||
|
return false;
|
||||||
|
|
||||||
/* If the source is an explicitly sized source, then we need to reset
|
/* If the source is an explicitly sized source, then we need to reset
|
||||||
* both the number of components and the swizzle.
|
* both the number of components and the swizzle.
|
||||||
*/
|
*/
|
||||||
|
@ -116,9 +126,6 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
||||||
|
|
||||||
switch (value->type) {
|
switch (value->type) {
|
||||||
case nir_search_value_expression:
|
case nir_search_value_expression:
|
||||||
if (!instr->src[src].src.is_ssa)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_alu)
|
if (instr->src[src].src.ssa->parent_instr->type != nir_instr_type_alu)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -131,8 +138,7 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
|
||||||
assert(var->variable < NIR_SEARCH_MAX_VARIABLES);
|
assert(var->variable < NIR_SEARCH_MAX_VARIABLES);
|
||||||
|
|
||||||
if (state->variables_seen & (1 << var->variable)) {
|
if (state->variables_seen & (1 << var->variable)) {
|
||||||
if (!nir_srcs_equal(state->variables[var->variable].src,
|
if (state->variables[var->variable].src.ssa != instr->src[src].src.ssa)
|
||||||
instr->src[src].src))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
assert(!instr->src[src].abs && !instr->src[src].negate);
|
assert(!instr->src[src].abs && !instr->src[src].negate);
|
||||||
|
|
Loading…
Reference in New Issue