glsl2: Track the number of ir_loop_jump instructions that are in a loop
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user