nir/search: Allow for matching variables based on types
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 29 Jan 2015 00:29:21 +0000 (16:29 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 30 Jan 2015 01:07:45 +0000 (17:07 -0800)
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>
src/glsl/nir/nir_search.c
src/glsl/nir/nir_search.h

index ec898174364a9134deb2f55cae4299ad2081d7f7..467193112d28d1aa9fc12b5f60b3f76b7d0ccf5e 100644 (file)
@@ -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)
             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[var->variable].src = instr->src[src].src;
          state->variables[var->variable].abs = false;
index 18aa28dcc66aafa5a038c7a5c65a0f75adcf5d6b..7d47792945e1033345ebd88312763490585971aa 100644 (file)
@@ -54,6 +54,18 @@ typedef struct {
     * given variable is only allowed to match constant values.
     */
    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;
 
 typedef struct {