nir/search: Add support for matching unknown constants
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 22 Jan 2015 22:15:27 +0000 (14:15 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 30 Jan 2015 01:07:45 +0000 (17:07 -0800)
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>
src/glsl/nir/nir_search.c
src/glsl/nir/nir_search.h

index 18e0330e4aeb852ef56c03b6e8d6bc8f6398a0da..ec898174364a9134deb2f55cae4299ad2081d7f7 100644 (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;
    }
 
index 8ec58b07139fc9f4afafe210d983194c178cadb2..18aa28dcc66aafa5a038c7a5c65a0f75adcf5d6b 100644 (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 {