glsl: In loop analysis, handle unconditional second assignment.
[mesa.git] / src / glsl / opt_tree_grafting.cpp
index e70a2240fca6ae98f2b06c8245e30dc4bd5a1715..46c06e6c4a5fc91fe201d7f7ff3fac3b7be8ba04 100644 (file)
@@ -54,6 +54,8 @@
 #include "ir_optimization.h"
 #include "glsl_types.h"
 
+namespace {
+
 static bool debug = false;
 
 class ir_tree_grafting_visitor : public ir_hierarchical_visitor {
@@ -202,14 +204,15 @@ ir_tree_grafting_visitor::visit_enter(ir_function_signature *ir)
 ir_visitor_status
 ir_tree_grafting_visitor::visit_enter(ir_call *ir)
 {
-   exec_list_iterator sig_iter = ir->get_callee()->parameters.iterator();
+   exec_list_iterator sig_iter = ir->callee->parameters.iterator();
    /* Reminder: iterating ir_call iterates its parameters. */
    foreach_iter(exec_list_iterator, iter, *ir) {
       ir_variable *sig_param = (ir_variable *)sig_iter.get();
       ir_rvalue *ir = (ir_rvalue *)iter.get();
       ir_rvalue *new_ir = ir;
 
-      if (sig_param->mode != ir_var_in && sig_param->mode != ir_var_const_in) {
+      if (sig_param->mode != ir_var_function_in
+          && sig_param->mode != ir_var_const_in) {
         if (check_graft(ir, sig_param) == visit_stop)
            return visit_stop;
         continue;
@@ -271,6 +274,8 @@ ir_tree_grafting_visitor::visit_enter(ir_texture *ir)
 
    switch (ir->op) {
    case ir_tex:
+   case ir_lod:
+   case ir_query_levels:
       break;
    case ir_txb:
       if (do_graft(&ir->lod_info.bias))
@@ -282,11 +287,19 @@ ir_tree_grafting_visitor::visit_enter(ir_texture *ir)
       if (do_graft(&ir->lod_info.lod))
         return visit_stop;
       break;
+   case ir_txf_ms:
+      if (do_graft(&ir->lod_info.sample_index))
+         return visit_stop;
+      break;
    case ir_txd:
       if (do_graft(&ir->lod_info.grad.dPdx) ||
          do_graft(&ir->lod_info.grad.dPdy))
         return visit_stop;
       break;
+   case ir_tg4:
+      if (do_graft(&ir->lod_info.component))
+         return visit_stop;
+      break;
    }
 
    return visit_continue;
@@ -348,8 +361,9 @@ tree_grafting_basic_block(ir_instruction *bb_first,
       if (!lhs_var)
         continue;
 
-      if (lhs_var->mode == ir_var_out ||
-         lhs_var->mode == ir_var_inout)
+      if (lhs_var->mode == ir_var_function_out ||
+         lhs_var->mode == ir_var_function_inout ||
+          lhs_var->mode == ir_var_shader_out)
         continue;
 
       ir_variable_refcount_entry *entry = info->refs->get_variable_entry(lhs_var);
@@ -369,6 +383,8 @@ tree_grafting_basic_block(ir_instruction *bb_first,
    }
 }
 
+} /* unnamed namespace */
+
 /**
  * Does a copy propagation pass on the code present in the instruction stream.
  */