Mesa (glsl2): glsl2: Flatten out expressions that are the child of an assignment rhs.

Eric Anholt anholt at kemper.freedesktop.org
Mon Jul 12 20:34:57 UTC 2010


Module: Mesa
Branch: glsl2
Commit: 5723e5bb8b73cd2a3b77d750972e3d0b4d0d0ff8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5723e5bb8b73cd2a3b77d750972e3d0b4d0d0ff8

Author: Eric Anholt <eric at anholt.net>
Date:   Mon Jul 12 10:48:22 2010 -0700

glsl2: Flatten out expressions that are the child of an assignment rhs.

This feels a little odd, but it will be useful for ir_mat_to_vec,
where I want to see a plain assignment of the expression to a
variable, not to a writemasked array dereference with a call as the
array index.

---

 src/glsl/ir_expression_flattening.cpp |   26 +++++++++++++++++++-------
 1 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/glsl/ir_expression_flattening.cpp b/src/glsl/ir_expression_flattening.cpp
index 5ba24e3..0f10b67 100644
--- a/src/glsl/ir_expression_flattening.cpp
+++ b/src/glsl/ir_expression_flattening.cpp
@@ -57,9 +57,11 @@ public:
    virtual ir_visitor_status visit_enter(ir_function_signature *);
    virtual ir_visitor_status visit_enter(ir_if *);
    virtual ir_visitor_status visit_enter(ir_loop *);
+   virtual ir_visitor_status visit_leave(ir_assignment *);
    virtual ir_visitor_status visit_leave(ir_expression *);
    virtual ir_visitor_status visit_leave(ir_swizzle *);
 
+   ir_rvalue *operand_to_temp(ir_rvalue *val);
    bool (*predicate)(ir_instruction *ir);
    ir_instruction *base_ir;
 };
@@ -77,13 +79,16 @@ do_expression_flattening(exec_list *instructions,
 }
 
 
-static ir_rvalue *
-operand_to_temp(ir_instruction *base_ir, ir_rvalue *ir)
+ir_rvalue *
+ir_expression_flattening_visitor::operand_to_temp(ir_rvalue *ir)
 {
    void *ctx = talloc_parent(base_ir);
    ir_variable *var;
    ir_assignment *assign;
 
+   if (!this->predicate(ir))
+      return ir;
+
    var = new(ctx) ir_variable(ir->type, "flattening_tmp");
    base_ir->insert_before(var);
 
@@ -131,20 +136,27 @@ ir_expression_flattening_visitor::visit_leave(ir_expression *ir)
       /* If the operand matches the predicate, then we'll assign its
        * value to a temporary and deref the temporary as the operand.
        */
-      if (this->predicate(ir->operands[operand])) {
-	 ir->operands[operand] = operand_to_temp(base_ir,
-						 ir->operands[operand]);
-      }
+      ir->operands[operand] = operand_to_temp(ir->operands[operand]);
    }
 
    return visit_continue;
 }
 
 ir_visitor_status
+ir_expression_flattening_visitor::visit_leave(ir_assignment *ir)
+{
+   ir->rhs = operand_to_temp(ir->rhs);
+   if (ir->condition)
+      ir->condition = operand_to_temp(ir->condition);
+
+   return visit_continue;
+}
+
+ir_visitor_status
 ir_expression_flattening_visitor::visit_leave(ir_swizzle *ir)
 {
    if (this->predicate(ir->val)) {
-      ir->val = operand_to_temp(this->base_ir, ir->val);
+      ir->val = operand_to_temp(ir->val);
    }
 
    return visit_continue;




More information about the mesa-commit mailing list