[Mesa-dev] [PATCH 1/4] glsl: Extract functions from loop_analysis::visit(ir_dereference_variable *).

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue Dec 3 07:15:04 PST 2013


On Thu, Nov 28, 2013 at 11:41:06AM -0800, Paul Berry wrote:
> This function is about to get more complex.
> ---
>  src/glsl/loop_analysis.cpp | 91 +++++++++++++++++++++++++++++++++-------------
>  src/glsl/loop_analysis.h   |  4 ++
>  2 files changed, 70 insertions(+), 25 deletions(-)
> 
> diff --git a/src/glsl/loop_analysis.cpp b/src/glsl/loop_analysis.cpp
> index b08241a..3f2a14b 100644
> --- a/src/glsl/loop_analysis.cpp
> +++ b/src/glsl/loop_analysis.cpp
> @@ -33,6 +33,43 @@ static bool all_expression_operands_are_loop_constant(ir_rvalue *,
>  static ir_rvalue *get_basic_induction_increment(ir_assignment *, hash_table *);
>  
>  
> +/**
> + * Record the fact that the given loop variable was referenced inside the loop.
> + *
> + * \arg in_assignee is true if the reference was on the LHS of an assignment.
> + *
> + * \arg in_conditional_code is true if the reference occurred inside an if
> + * statement.
> + *
> + * \arg current_assignment is the ir_assignment node that the loop variable is
> + * on the LHS of, if any (ignored if \c in_assignee is false).
> + */
> +void
> +loop_variable::record_reference(bool in_assignee, bool in_conditional_code,
> +                                ir_assignment *current_assignment)
> +{
> +   if (in_assignee) {
> +      assert(current_assignment != NULL);
> +
> +      this->conditional_assignment = in_conditional_code
> +         || current_assignment->condition != NULL;
> +
> +      if (this->first_assignment == NULL) {
> +         assert(this->num_assignments == 0);
> +
> +         this->first_assignment = current_assignment;
> +      }
> +
> +      this->num_assignments++;
> +   } else if (this->first_assignment == current_assignment) {
> +      /* This catches the case where the variable is used in the RHS of an
> +       * assignment where it is also in the LHS.
> +       */
> +      this->read_before_write = true;
> +   }
> +}
> +
> +
>  loop_state::loop_state()
>  {
>     this->ht = hash_table_ctor(0, hash_table_pointer_hash,
> @@ -102,6 +139,32 @@ loop_variable_state::insert(ir_if *if_stmt)
>     return t;
>  }
>  
> +
> +/**
> + * If the given variable already is recored in the state for this loop, return
                                            ^
recorded

> + * the corresponding loop_variable object that records information about it.
> + *
> + * Otherwise, create a new loop_variable object to record information about
> + * the variable, and set its \c read_before_write field appropriately based on
> + * \c in_assignee.
> + *
> + * \arg in_assignee is true if this variable was encountered on the LHS of an
> + * assignment.
> + */
> +loop_variable *
> +loop_variable_state::get_or_insert(ir_variable *var, bool in_assignee)
> +{
> +   loop_variable *lv = this->get(var);
> +
> +   if (lv == NULL) {
> +      lv = this->insert(var);
> +      lv->read_before_write = !in_assignee;
> +   }
> +
> +   return lv;
> +}
> +
> +
>  namespace {
>  
>  class loop_analysis : public ir_hierarchical_visitor {
> @@ -181,32 +244,10 @@ loop_analysis::visit(ir_dereference_variable *ir)
>        (loop_variable_state *) this->state.get_head();
>  
>     ir_variable *var = ir->variable_referenced();
> -   loop_variable *lv = ls->get(var);
> -
> -   if (lv == NULL) {
> -      lv = ls->insert(var);
> -      lv->read_before_write = !this->in_assignee;
> -   }
> -
> -   if (this->in_assignee) {
> -      assert(this->current_assignment != NULL);
> +   loop_variable *lv = ls->get_or_insert(var, this->in_assignee);
>  
> -      lv->conditional_assignment = (this->if_statement_depth > 0)
> -	 || (this->current_assignment->condition != NULL);
> -
> -      if (lv->first_assignment == NULL) {
> -	 assert(lv->num_assignments == 0);
> -
> -	 lv->first_assignment = this->current_assignment;
> -      }
> -
> -      lv->num_assignments++;
> -   } else if (lv->first_assignment == this->current_assignment) {
> -      /* This catches the case where the variable is used in the RHS of an
> -       * assignment where it is also in the LHS.
> -       */
> -      lv->read_before_write = true;
> -   }
> +   lv->record_reference(this->in_assignee, this->if_statement_depth > 0,
> +                        this->current_assignment);
>  
>     return visit_continue;
>  }
> diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h
> index 769d626..edad8f3 100644
> --- a/src/glsl/loop_analysis.h
> +++ b/src/glsl/loop_analysis.h
> @@ -67,6 +67,7 @@ class loop_variable_state : public exec_node {
>  public:
>     class loop_variable *get(const ir_variable *);
>     class loop_variable *insert(ir_variable *);
> +   class loop_variable *get_or_insert(ir_variable *, bool in_assignee);
>     class loop_terminator *insert(ir_if *);
>  
>  
> @@ -217,6 +218,9 @@ public:
>  
>        return is_const;
>     }
> +
> +   void record_reference(bool in_assignee, bool in_conditional_code,
> +                         ir_assignment *current_assignment);
>  };
>  
>  
> -- 
> 1.8.4.2
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list