On Tue,  2 Aug 2011 17:52:03 -0700, "Ian Romanick" <i...@freedesktop.org> wrote:
> From: Ian Romanick <ian.d.roman...@intel.com>
> 
> Now the condition (for the then-clause) and the inverse condition (for
> the else-clause) get written to sepearate temporary variables.  In the

"separate"

> presense of complex conditions, this may result in more code being
> generated.

I hope s/more/less/

And this is all because we don't CSE, right.  We should get on that :)

Patch 1,2 get Reviewed-by: Eric Anholt <e...@anholt.net>

Couple more comments below.

> ---
>  src/glsl/lower_if_to_cond_assign.cpp |   62 ++++++++++++++++++++++-----------
>  1 files changed, 41 insertions(+), 21 deletions(-)
> 
> diff --git a/src/glsl/lower_if_to_cond_assign.cpp 
> b/src/glsl/lower_if_to_cond_assign.cpp
> index 5c74bc1..3f82700 100644
> --- a/src/glsl/lower_if_to_cond_assign.cpp
> +++ b/src/glsl/lower_if_to_cond_assign.cpp
> @@ -136,7 +136,6 @@ ir_if_to_cond_assign_visitor::visit_leave(ir_if *ir)
>        return visit_continue;
>  
>     bool found_control_flow = false;
> -   ir_variable *cond_var;
>     ir_assignment *assign;
>     ir_dereference_variable *deref;
>  
> @@ -154,31 +153,52 @@ ir_if_to_cond_assign_visitor::visit_leave(ir_if *ir)
>  
>     void *mem_ctx = ralloc_parent(ir);
>  
> -   /* Store the condition to a variable so the assignment conditions are
> -    * simpler.
> +   /* Store the condition to a variable.  Move all of the instructions from
> +    * the then-clause if the if-statement.  Use the condition variable as a

"of the if-statement"

> +    * condition for all assignments.
>      */
> -   cond_var = new(mem_ctx) ir_variable(glsl_type::bool_type,
> -                                    "if_to_cond_assign_condition",
> -                                    ir_var_temporary);
> -   ir->insert_before(cond_var);
> -
> -   deref = new(mem_ctx) ir_dereference_variable(cond_var);
> -   assign = new(mem_ctx) ir_assignment(deref,
> -                                    ir->condition, NULL);
> +   ir_variable *const then_var =
> +      new(mem_ctx) ir_variable(glsl_type::bool_type,
> +                            "if_to_cond_assign_then",
> +                            ir_var_temporary);
> +   ir->insert_before(then_var);
> +
> +   ir_dereference_variable *then_cond =
> +      new(mem_ctx) ir_dereference_variable(then_var);
> +
> +   assign = new(mem_ctx) ir_assignment(then_cond, ir->condition);
>     ir->insert_before(assign);
>  
> -   /* Now, move all of the instructions out of the if blocks, putting
> -    * conditions on assignments.
> -    */
> -   move_block_to_cond_assign(mem_ctx, ir, deref,
> +   move_block_to_cond_assign(mem_ctx, ir, then_cond,
>                            &ir->then_instructions);
>  
> -   ir_rvalue *inverse =
> -      new(mem_ctx) ir_expression(ir_unop_logic_not,
> -                              glsl_type::bool_type,
> -                              deref->clone(mem_ctx, NULL),
> -                              NULL);
> -   move_block_to_cond_assign(mem_ctx, ir, inverse, &ir->else_instructions);
> +   /* If there are instructions in the else-clause, store the inverse of the
> +    * condition to a variable.  Move all of the instructions from the
> +    * else-clause if the if-statement.  Use the (inverse) condition variable
> +    * as a condition for all assignments.
> +    */
> +   if (!ir->else_instructions.is_empty()) {
> +      ir_variable *const else_var =
> +      new(mem_ctx) ir_variable(glsl_type::bool_type,
> +                               "if_to_cond_assign_else",
> +                               ir_var_temporary);
> +      ir->insert_before(else_var);
> +
> +      ir_dereference_variable *else_cond =
> +      new(mem_ctx) ir_dereference_variable(else_var);
> +
> +      ir_rvalue *inverse =
> +      new(mem_ctx) ir_expression(ir_unop_logic_not,
> +                                 glsl_type::bool_type,
> +                                 then_cond->clone(mem_ctx, NULL),
> +                                 NULL);

Could drop the bool_type on ir_expression()

> +      assign = new(mem_ctx) ir_assignment(else_cond, inverse);
> +      ir->insert_before(assign);
> +
> +      move_block_to_cond_assign(mem_ctx, ir, else_cond,
> +                             &ir->else_instructions);
> +   }

Attachment: pgpk4AYMx6hwY.pgp
Description: PGP signature

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to