[Mesa-dev] [PATCH 3/4] glsl: Slight change to the code generated by if-flattening
Eric Anholt
eric at anholt.net
Tue Aug 2 19:45:21 PDT 2011
On Tue, 2 Aug 2011 17:52:03 -0700, "Ian Romanick" <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at 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 <eric at 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);
> + }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110802/ad9b7743/attachment.pgp>
More information about the mesa-dev
mailing list