summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2017-01-10 10:24:55 -0800
committerJason Ekstrand <[email protected]>2017-01-11 10:28:18 -0800
commitc472568b4e458c9882a98850668f99144c7ca6bf (patch)
tree24265407da22653d2f9eae03e2f7fd26e126bd69 /src
parent534ea2b5ba0282a350dc02d21bfbc8ffa1f8635d (diff)
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 <[email protected]> Cc: "13.0" <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/compiler/nir/nir_search.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/compiler/nir/nir_search.c b/src/compiler/nir/nir_search.c
index b34b13fdb89..10a0941fa20 100644
--- a/src/compiler/nir/nir_search.c
+++ b/src/compiler/nir/nir_search.c
@@ -98,6 +98,16 @@ match_value(const nir_search_value *value, nir_alu_instr *instr, unsigned src,
{
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
* 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) {
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)
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);
if (state->variables_seen & (1 << var->variable)) {
- if (!nir_srcs_equal(state->variables[var->variable].src,
- instr->src[src].src))
+ if (state->variables[var->variable].src.ssa != instr->src[src].src.ssa)
return false;
assert(!instr->src[src].abs && !instr->src[src].negate);