nir/builder: Use nir_after_instr to advance the cursor
[mesa.git] / src / glsl / opt_constant_variable.cpp
index a026c51c31e4df18432753b19306f88e03400e09..7aaaeedf98d23e912857e70707e7bef9f900c358 100644 (file)
@@ -115,6 +115,13 @@ ir_constant_variable_visitor::visit_enter(ir_assignment *ir)
    if (!var)
       return visit_continue;
 
+   /* Ignore buffer variables, since the underlying storage is shared
+    * and we can't be sure that this variable won't be written by another
+    * thread.
+    */
+   if (var->data.mode == ir_var_shader_storage)
+      return visit_continue;
+
    constval = ir->rhs->constant_expression_value();
    if (!constval)
       return visit_continue;
@@ -132,10 +139,10 @@ ir_visitor_status
 ir_constant_variable_visitor::visit_enter(ir_call *ir)
 {
    /* Mark any out parameters as assigned to */
-   exec_list_iterator sig_iter = ir->callee->parameters.iterator();
-   foreach_iter(exec_list_iterator, iter, *ir) {
-      ir_rvalue *param_rval = (ir_rvalue *)iter.get();
-      ir_variable *param = (ir_variable *)sig_iter.get();
+   foreach_two_lists(formal_node, &ir->callee->parameters,
+                     actual_node, &ir->actual_parameters) {
+      ir_rvalue *param_rval = (ir_rvalue *) actual_node;
+      ir_variable *param = (ir_variable *) formal_node;
 
       if (param->data.mode == ir_var_function_out ||
          param->data.mode == ir_var_function_inout) {
@@ -146,7 +153,6 @@ ir_constant_variable_visitor::visit_enter(ir_call *ir)
         entry = get_assignment_entry(var, &this->list);
         entry->assignment_count++;
       }
-      sig_iter.next();
    }
 
    /* Mark the return storage as having been assigned to */
@@ -194,13 +200,10 @@ do_constant_variable_unlinked(exec_list *instructions)
 {
    bool progress = false;
 
-   foreach_iter(exec_list_iterator, iter, *instructions) {
-      ir_instruction *ir = (ir_instruction *)iter.get();
+   foreach_in_list(ir_instruction, ir, instructions) {
       ir_function *f = ir->as_function();
       if (f) {
-        foreach_iter(exec_list_iterator, sigiter, *f) {
-           ir_function_signature *sig =
-              (ir_function_signature *) sigiter.get();
+        foreach_in_list(ir_function_signature, sig, &f->signatures) {
            if (do_constant_variable(&sig->body))
               progress = true;
         }