diff options
author | Ian Romanick <[email protected]> | 2010-05-14 12:53:33 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-05-17 12:03:13 -0700 |
commit | 671e4f6321ce173b97fdbb459778df0bc9625b9b (patch) | |
tree | 0a284164f01a91d0f3fdc113db035d802352ec6c /ir_function_can_inline.cpp | |
parent | b5a7cf93442c2def485dcfd05df46abcd78b5d21 (diff) |
Reimplement ir_function_can_inline_visitor using ir_hierarchical_vistor
The output of all test cases was verified to be the same using diff.
Diffstat (limited to 'ir_function_can_inline.cpp')
-rw-r--r-- | ir_function_can_inline.cpp | 163 |
1 files changed, 16 insertions, 147 deletions
diff --git a/ir_function_can_inline.cpp b/ir_function_can_inline.cpp index 6c96a206a68..3be351055dd 100644 --- a/ir_function_can_inline.cpp +++ b/ir_function_can_inline.cpp @@ -35,12 +35,8 @@ #define NULL 0 #include "ir.h" -#include "ir_visitor.h" -#include "ir_function_inlining.h" -#include "ir_expression_flattening.h" -#include "glsl_types.h" -class ir_function_can_inline_visitor : public ir_visitor { +class ir_function_can_inline_visitor : public ir_hierarchical_visitor { public: ir_function_can_inline_visitor() { @@ -48,164 +44,40 @@ public: this->num_returns = 0; } - /** - * \name Visit methods - * - * As typical for the visitor pattern, there must be one \c visit method for - * each concrete subclass of \c ir_instruction. Virtual base classes within - * the hierarchy should not have \c visit methods. - */ - /*@{*/ - virtual void visit(ir_variable *); - virtual void visit(ir_label *); - virtual void visit(ir_loop *); - virtual void visit(ir_loop_jump *); - virtual void visit(ir_function_signature *); - virtual void visit(ir_function *); - virtual void visit(ir_expression *); - virtual void visit(ir_swizzle *); - virtual void visit(ir_dereference *); - virtual void visit(ir_assignment *); - virtual void visit(ir_constant *); - virtual void visit(ir_call *); - virtual void visit(ir_return *); - virtual void visit(ir_if *); - /*@}*/ + virtual ir_visitor_status visit_enter(ir_loop *); + virtual ir_visitor_status visit_enter(ir_return *); + virtual ir_visitor_status visit_enter(ir_if *); bool can_inline; int num_returns; }; -void -ir_function_can_inline_visitor::visit(ir_variable *ir) -{ - (void)ir; -} - -void -ir_function_can_inline_visitor::visit(ir_label *ir) -{ - (void)ir; -} - -void -ir_function_can_inline_visitor::visit(ir_loop *ir) +ir_visitor_status +ir_function_can_inline_visitor::visit_enter(ir_loop *ir) { /* FINISHME: Implement loop cloning in ir_function_inlining.cpp */ - this->can_inline = false; - - if (ir->from) - ir->from->accept(this); - if (ir->to) - ir->to->accept(this); - if (ir->increment) - ir->increment->accept(this); - - foreach_iter(exec_list_iterator, iter, ir->body_instructions) { - ir_instruction *inner_ir = (ir_instruction *)iter.get(); - inner_ir->accept(this); - } -} - -void -ir_function_can_inline_visitor::visit(ir_loop_jump *ir) -{ (void) ir; + this->can_inline = false; + return visit_stop; } -void -ir_function_can_inline_visitor::visit(ir_function_signature *ir) -{ - (void)ir; -} - - -void -ir_function_can_inline_visitor::visit(ir_function *ir) +ir_visitor_status +ir_function_can_inline_visitor::visit_enter(ir_return *ir) { (void) ir; -} - -void -ir_function_can_inline_visitor::visit(ir_expression *ir) -{ - unsigned int operand; - - for (operand = 0; operand < ir->get_num_operands(); operand++) { - ir->operands[operand]->accept(this); - } -} - - -void -ir_function_can_inline_visitor::visit(ir_swizzle *ir) -{ - ir->val->accept(this); -} - -void -ir_function_can_inline_visitor::visit(ir_dereference *ir) -{ - ir->var->accept(this); - if (ir->mode == ir_dereference::ir_reference_array) - ir->selector.array_index->accept(this); -} - -void -ir_function_can_inline_visitor::visit(ir_assignment *ir) -{ - ir->lhs->accept(this); - ir->rhs->accept(this); - if (ir->condition) - ir->condition->accept(this); -} - - -void -ir_function_can_inline_visitor::visit(ir_constant *ir) -{ - (void)ir; -} - - -void -ir_function_can_inline_visitor::visit(ir_call *ir) -{ - foreach_iter(exec_list_iterator, iter, *ir) { - ir_rvalue *param = (ir_rvalue *)iter.get(); - - param->accept(this); - } -} - - -void -ir_function_can_inline_visitor::visit(ir_return *ir) -{ - ir->get_value()->accept(this); - this->num_returns++; + return visit_continue; } -void -ir_function_can_inline_visitor::visit(ir_if *ir) +ir_visitor_status +ir_function_can_inline_visitor::visit_enter(ir_if *ir) { /* FINISHME: Implement if cloning in ir_function_inlining.cpp. */ + (void) ir; this->can_inline = false; - - ir->condition->accept(this); - - foreach_iter(exec_list_iterator, iter, ir->then_instructions) { - ir_instruction *inner_ir = (ir_instruction *)iter.get(); - inner_ir->accept(this); - } - - foreach_iter(exec_list_iterator, iter, ir->else_instructions) { - ir_instruction *inner_ir = (ir_instruction *)iter.get(); - inner_ir->accept(this); - } + return visit_stop; } bool @@ -214,10 +86,7 @@ can_inline(ir_call *call) ir_function_can_inline_visitor v; const ir_function_signature *callee = call->get_callee(); - foreach_iter(exec_list_iterator, iter, callee->body) { - ir_instruction *ir = (ir_instruction *)iter.get(); - ir->accept(&v); - } + v.run((exec_list *) &callee->body); ir_instruction *last = (ir_instruction *)callee->body.get_tail(); if (last && !last->as_return()) |