Mesa (master): glsl2: Allow copy / constant propagation into array indices

Ian Romanick idr at kemper.freedesktop.org
Fri Sep 3 19:01:04 UTC 2010


Module: Mesa
Branch: master
Commit: 4e5b41c2f6b6423d0df260a9dea7938546134ec6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4e5b41c2f6b6423d0df260a9dea7938546134ec6

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Fri Aug 27 16:22:36 2010 -0700

glsl2: Allow copy / constant propagation into array indices

---

 src/glsl/ir_constant_propagation.cpp |   18 ++++++------------
 src/glsl/ir_copy_propagation.cpp     |   26 ++++++--------------------
 2 files changed, 12 insertions(+), 32 deletions(-)

diff --git a/src/glsl/ir_constant_propagation.cpp b/src/glsl/ir_constant_propagation.cpp
index 76c1ce7..f7a0599 100644
--- a/src/glsl/ir_constant_propagation.cpp
+++ b/src/glsl/ir_constant_propagation.cpp
@@ -90,7 +90,7 @@ public:
    virtual ir_visitor_status visit_enter(class ir_loop *);
    virtual ir_visitor_status visit_enter(class ir_function_signature *);
    virtual ir_visitor_status visit_enter(class ir_function *);
-   virtual ir_visitor_status visit_enter(class ir_assignment *);
+   virtual ir_visitor_status visit_leave(class ir_assignment *);
    virtual ir_visitor_status visit_enter(class ir_call *);
    virtual ir_visitor_status visit_enter(class ir_if *);
 
@@ -119,7 +119,7 @@ public:
 void
 ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue)
 {
-   if (!*rvalue)
+   if (this->in_assignee || !*rvalue)
       return;
 
    const glsl_type *type = (*rvalue)->type;
@@ -216,22 +216,16 @@ ir_constant_propagation_visitor::visit_enter(ir_function_signature *ir)
 }
 
 ir_visitor_status
-ir_constant_propagation_visitor::visit_enter(ir_assignment *ir)
+ir_constant_propagation_visitor::visit_leave(ir_assignment *ir)
 {
-   /* Inline accepting children, skipping the LHS. */
-   ir->rhs->accept(this);
-   handle_rvalue(&ir->rhs);
-
-   if (ir->condition) {
-      ir->condition->accept(this);
-      handle_rvalue(&ir->condition);
-   }
+   if (this->in_assignee)
+      return visit_continue;
 
    kill(ir->lhs->variable_referenced(), ir->write_mask);
 
    add_constant(ir);
 
-   return visit_continue_with_parent;
+   return visit_continue;
 }
 
 ir_visitor_status
diff --git a/src/glsl/ir_copy_propagation.cpp b/src/glsl/ir_copy_propagation.cpp
index 6c211f0..0fe8fa6 100644
--- a/src/glsl/ir_copy_propagation.cpp
+++ b/src/glsl/ir_copy_propagation.cpp
@@ -84,7 +84,7 @@ public:
    virtual ir_visitor_status visit_enter(class ir_loop *);
    virtual ir_visitor_status visit_enter(class ir_function_signature *);
    virtual ir_visitor_status visit_enter(class ir_function *);
-   virtual ir_visitor_status visit_enter(class ir_assignment *);
+   virtual ir_visitor_status visit_leave(class ir_assignment *);
    virtual ir_visitor_status visit_enter(class ir_call *);
    virtual ir_visitor_status visit_enter(class ir_if *);
 
@@ -132,30 +132,13 @@ ir_copy_propagation_visitor::visit_enter(ir_function_signature *ir)
 }
 
 ir_visitor_status
-ir_copy_propagation_visitor::visit_enter(ir_assignment *ir)
+ir_copy_propagation_visitor::visit_leave(ir_assignment *ir)
 {
-   ir_visitor_status s;
-
-   /* ir_assignment::accept(ir_hv *v), skipping the LHS so that we can
-    * avoid copy propagating into the LHS.
-    *
-    * Note that this means we won't copy propagate into the derefs of
-    * an array index.  Oh well.
-    */
-
-   s = ir->rhs->accept(this);
-   assert(s == visit_continue);
-
-   if (ir->condition) {
-      s = ir->condition->accept(this);
-      assert(s == visit_continue);
-   }
-
    kill(ir->lhs->variable_referenced());
 
    add_copy(ir);
 
-   return visit_continue_with_parent;
+   return visit_continue;
 }
 
 ir_visitor_status
@@ -175,6 +158,9 @@ ir_copy_propagation_visitor::visit_enter(ir_function *ir)
 ir_visitor_status
 ir_copy_propagation_visitor::visit(ir_dereference_variable *ir)
 {
+   if (this->in_assignee)
+      return visit_continue;
+
    ir_variable *var = ir->var;
 
    foreach_iter(exec_list_iterator, iter, *this->acp) {




More information about the mesa-commit mailing list