glsl2: Track the number of ir_loop_jump instructions that are in a loop

This commit is contained in:
Ian Romanick
2010-08-27 15:41:20 -07:00
parent 351525d534
commit 3bcfafcf03
3 changed files with 27 additions and 0 deletions

View File

@@ -103,6 +103,7 @@ class loop_analysis : public ir_hierarchical_visitor {
public: public:
loop_analysis(); loop_analysis();
virtual ir_visitor_status visit(ir_loop_jump *);
virtual ir_visitor_status visit(ir_dereference_variable *); virtual ir_visitor_status visit(ir_dereference_variable *);
virtual ir_visitor_status visit_enter(ir_loop *); virtual ir_visitor_status visit_enter(ir_loop *);
@@ -131,6 +132,22 @@ loop_analysis::loop_analysis()
} }
ir_visitor_status
loop_analysis::visit(ir_loop_jump *ir)
{
(void) ir;
assert(!this->state.is_empty());
loop_variable_state *const ls =
(loop_variable_state *) this->state.get_head();
ls->num_loop_jumps++;
return visit_continue;
}
ir_visitor_status ir_visitor_status
loop_analysis::visit(ir_dereference_variable *ir) loop_analysis::visit(ir_dereference_variable *ir)
{ {

View File

@@ -104,8 +104,14 @@ public:
*/ */
hash_table *var_hash; hash_table *var_hash;
/**
* Number of ir_loop_jump instructions that operate on this loop
*/
unsigned num_loop_jumps;
loop_variable_state() loop_variable_state()
{ {
this->num_loop_jumps = 0;
this->var_hash = hash_table_ctor(0, hash_table_pointer_hash, this->var_hash = hash_table_ctor(0, hash_table_pointer_hash,
hash_table_pointer_compare); hash_table_pointer_compare);
} }

View File

@@ -253,6 +253,10 @@ loop_control_visitor::visit_leave(ir_loop *ir)
* satisfied. * satisfied.
*/ */
if_stmt->remove(); if_stmt->remove();
assert(ls->num_loop_jumps > 0);
ls->num_loop_jumps--;
this->progress = true; this->progress = true;
} }