glsl: fix the type of ir_constant_data::u16
[mesa.git] / src / compiler / glsl / opt_constant_variable.cpp
index 914b46004c15c354c49b552e312a2076fceee71c..3f2b6a04b9ffaea9be0b02f59b274272c2ce7631 100644 (file)
@@ -49,6 +49,9 @@ struct assignment_entry {
 
 class ir_constant_variable_visitor : public ir_hierarchical_visitor {
 public:
+   using ir_hierarchical_visitor::visit;
+   using ir_hierarchical_visitor::visit_enter;
+
    virtual ir_visitor_status visit_enter(ir_dereference_variable *);
    virtual ir_visitor_status visit(ir_variable *);
    virtual ir_visitor_status visit_enter(ir_assignment *);
@@ -162,6 +165,15 @@ ir_constant_variable_visitor::visit_enter(ir_call *ir)
         entry = get_assignment_entry(var, this->ht);
         entry->assignment_count++;
       }
+
+      /* We don't know if the variable passed to this function has been
+       * assigned a value or if it is undefined, so for now we always assume
+       * it has been assigned a value. Once functions have been inlined any
+       * further potential optimisations will be taken care of.
+       */
+      struct assignment_entry *entry;
+      entry = get_assignment_entry(param, this->ht);
+      entry->assignment_count++;
    }
 
    /* Mark the return storage as having been assigned to */
@@ -186,11 +198,9 @@ do_constant_variable(exec_list *instructions)
    bool progress = false;
    ir_constant_variable_visitor v;
 
-   v.ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
-                                  _mesa_key_pointer_equal);
+   v.ht = _mesa_pointer_hash_table_create(NULL);
    v.run(instructions);
 
-   struct hash_entry *hte;
    hash_table_foreach(v.ht, hte) {
       struct assignment_entry *entry = (struct assignment_entry *) hte->data;