r600g: Add support for RATs in evergreen_cb()
[mesa.git] / src / glsl / opt_dead_code.cpp
index f47b9613e1964df3031ea0edb7d877bc3c0a7bb9..0578f1737b050becd8405eddbcc58f8bc16ffe05 100644 (file)
@@ -32,8 +32,6 @@
 #include "ir_variable_refcount.h"
 #include "glsl_types.h"
 
-using std::printf;
-
 static bool debug = false;
 
 /**
@@ -44,7 +42,7 @@ static bool debug = false;
  * for usage on an unlinked instruction stream.
  */
 bool
-do_dead_code(exec_list *instructions)
+do_dead_code(exec_list *instructions, bool uniform_locations_assigned)
 {
    ir_variable_refcount_visitor v;
    bool progress = false;
@@ -52,7 +50,7 @@ do_dead_code(exec_list *instructions)
    v.run(instructions);
 
    foreach_iter(exec_list_iterator, iter, v.variable_list) {
-      variable_entry *entry = (variable_entry *)iter.get();
+      ir_variable_refcount_entry *entry = (ir_variable_refcount_entry *)iter.get();
 
       /* Since each assignment is a reference, the refereneced count must be
        * greater than or equal to the assignment count.  If they are equal,
@@ -80,8 +78,7 @@ do_dead_code(exec_list *instructions)
          * Don't do so if it's a shader output, though.
          */
         if (entry->var->mode != ir_var_out &&
-            entry->var->mode != ir_var_inout &&
-            !ir_has_call(entry->assign)) {
+            entry->var->mode != ir_var_inout) {
            entry->assign->remove();
            progress = true;
 
@@ -96,10 +93,11 @@ do_dead_code(exec_list *instructions)
          */
 
         /* uniform initializers are precious, and could get used by another
-         * stage.
+         * stage.  Also, once uniform locations have been assigned, the
+         * declaration cannot be deleted.
          */
         if (entry->var->mode == ir_var_uniform &&
-            entry->var->constant_value)
+            (uniform_locations_assigned || entry->var->constant_value))
            continue;
 
         entry->var->remove();
@@ -134,7 +132,12 @@ do_dead_code_unlinked(exec_list *instructions)
         foreach_iter(exec_list_iterator, sigiter, *f) {
            ir_function_signature *sig =
               (ir_function_signature *) sigiter.get();
-           if (do_dead_code(&sig->body))
+           /* The setting of the uniform_locations_assigned flag here is
+            * irrelevent.  If there is a uniform declaration encountered
+            * inside the body of the function, something has already gone
+            * terribly, terribly wrong.
+            */
+           if (do_dead_code(&sig->body, false))
               progress = true;
         }
       }