ir_expression_flattening: Fix breakage from hierarchichal visitor.
authorEric Anholt <eric@anholt.net>
Tue, 1 Jun 2010 22:06:11 +0000 (15:06 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 1 Jun 2010 22:15:04 +0000 (15:15 -0700)
Similar to other situations where the visitor pattern doesn't fit, in
this case we need the pointer to the base instruction in the
instruction stream for where to insert any new instructions we
generate (not the instruction in the tree we're looking at).  By
removing the code for setting the base_ir, flattened expressions would
end up, for example, before the function definition where they had appeared.

ir_expression_flattening.cpp

index b0b1e20356792e6577896903cfbc33fdde44f78e..9c410b162fca04b6ef8503619913defd0a2c4059 100644 (file)
@@ -55,6 +55,9 @@ public:
 
    virtual ir_visitor_status visit_enter(ir_call *);
    virtual ir_visitor_status visit_enter(ir_return *);
+   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_expression *);
 
    bool (*predicate)(ir_instruction *ir);
@@ -73,6 +76,33 @@ do_expression_flattening(exec_list *instructions,
    }
 }
 
+ir_visitor_status
+ir_expression_flattening_visitor::visit_enter(ir_function_signature *ir)
+{
+   do_expression_flattening(&ir->body, this->predicate);
+
+   return visit_continue_with_parent;
+}
+
+ir_visitor_status
+ir_expression_flattening_visitor::visit_enter(ir_loop *ir)
+{
+   do_expression_flattening(&ir->body_instructions, this->predicate);
+
+   return visit_continue_with_parent;
+}
+
+ir_visitor_status
+ir_expression_flattening_visitor::visit_enter(ir_if *ir)
+{
+   ir->condition->accept(this);
+
+   do_expression_flattening(&ir->then_instructions, this->predicate);
+   do_expression_flattening(&ir->else_instructions, this->predicate);
+
+   return visit_continue_with_parent;
+}
+
 ir_visitor_status
 ir_expression_flattening_visitor::visit_leave(ir_expression *ir)
 {