summaryrefslogtreecommitdiff
path: root/ir_expression_flattening.cpp
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-06-01 15:06:11 -0700
committerEric Anholt <eric@anholt.net>2010-06-01 15:15:04 -0700
commit459e4a286cce4fa8d52e4f6e157f4c6df46de695 (patch)
tree9f4c370cb352efcfe50560f7e949786b87035670 /ir_expression_flattening.cpp
parente668c2a9eeca65e5b2a7635074d9c47c93a68c6e (diff)
ir_expression_flattening: Fix breakage from hierarchichal visitor.
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.
Diffstat (limited to 'ir_expression_flattening.cpp')
-rw-r--r--ir_expression_flattening.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/ir_expression_flattening.cpp b/ir_expression_flattening.cpp
index b0b1e20356..9c410b162f 100644
--- a/ir_expression_flattening.cpp
+++ b/ir_expression_flattening.cpp
@@ -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);
@@ -74,6 +77,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)
{
unsigned int operand;