summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2011-08-01 13:28:11 -0700
committerIan Romanick <[email protected]>2011-08-15 11:44:26 -0700
commit5c843785417225ba582878a15a5ae13b7b961aaa (patch)
tree80721f6b757af18e721734df4c7eab13d2295c99
parent2e71c7d4ffa439dace639bd9c66174544dcd02d7 (diff)
glsl: Make move_block_to_cond_assign not care which branch it's processing
This will make some future changes a bit easier to digest. Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r--src/glsl/lower_if_to_cond_assign.cpp44
1 files changed, 17 insertions, 27 deletions
diff --git a/src/glsl/lower_if_to_cond_assign.cpp b/src/glsl/lower_if_to_cond_assign.cpp
index b637eb4fe1d..2d447e043a5 100644
--- a/src/glsl/lower_if_to_cond_assign.cpp
+++ b/src/glsl/lower_if_to_cond_assign.cpp
@@ -94,40 +94,23 @@ check_control_flow(ir_instruction *ir, void *data)
void
move_block_to_cond_assign(void *mem_ctx,
- ir_if *if_ir, ir_variable *cond_var, bool then)
+ ir_if *if_ir, ir_rvalue *cond_expr,
+ exec_list *instructions)
{
- exec_list *instructions;
-
- if (then) {
- instructions = &if_ir->then_instructions;
- } else {
- instructions = &if_ir->else_instructions;
- }
-
foreach_iter(exec_list_iterator, iter, *instructions) {
ir_instruction *ir = (ir_instruction *)iter.get();
if (ir->ir_type == ir_type_assignment) {
ir_assignment *assign = (ir_assignment *)ir;
- ir_rvalue *cond_expr;
- ir_dereference *deref = new(mem_ctx) ir_dereference_variable(cond_var);
-
- if (then) {
- cond_expr = deref;
- } else {
- cond_expr = new(mem_ctx) ir_expression(ir_unop_logic_not,
- glsl_type::bool_type,
- deref,
- NULL);
- }
if (!assign->condition) {
- assign->condition = cond_expr;
+ assign->condition = cond_expr->clone(mem_ctx, NULL);
} else {
- assign->condition = new(mem_ctx) ir_expression(ir_binop_logic_and,
- glsl_type::bool_type,
- cond_expr,
- assign->condition);
+ assign->condition =
+ new(mem_ctx) ir_expression(ir_binop_logic_and,
+ glsl_type::bool_type,
+ cond_expr->clone(mem_ctx, NULL),
+ assign->condition);
}
}
@@ -187,8 +170,15 @@ ir_if_to_cond_assign_visitor::visit_leave(ir_if *ir)
/* Now, move all of the instructions out of the if blocks, putting
* conditions on assignments.
*/
- move_block_to_cond_assign(mem_ctx, ir, cond_var, true);
- move_block_to_cond_assign(mem_ctx, ir, cond_var, false);
+ move_block_to_cond_assign(mem_ctx, ir, deref,
+ &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);
ir->remove();