From: Ian Romanick Date: Fri, 27 Aug 2010 22:41:20 +0000 (-0700) Subject: glsl2: Track the number of ir_loop_jump instructions that are in a loop X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3bcfafcf0320ee5407716ff67062e80d162760d4;p=mesa.git glsl2: Track the number of ir_loop_jump instructions that are in a loop --- diff --git a/src/glsl/loop_analysis.cpp b/src/glsl/loop_analysis.cpp index 2ea2f3dbe39..f1268c04c4d 100644 --- a/src/glsl/loop_analysis.cpp +++ b/src/glsl/loop_analysis.cpp @@ -103,6 +103,7 @@ class loop_analysis : public ir_hierarchical_visitor { public: loop_analysis(); + virtual ir_visitor_status visit(ir_loop_jump *); virtual ir_visitor_status visit(ir_dereference_variable *); 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 loop_analysis::visit(ir_dereference_variable *ir) { diff --git a/src/glsl/loop_analysis.h b/src/glsl/loop_analysis.h index b7c05149438..f5c5a04be81 100644 --- a/src/glsl/loop_analysis.h +++ b/src/glsl/loop_analysis.h @@ -104,8 +104,14 @@ public: */ hash_table *var_hash; + /** + * Number of ir_loop_jump instructions that operate on this loop + */ + unsigned num_loop_jumps; + loop_variable_state() { + this->num_loop_jumps = 0; this->var_hash = hash_table_ctor(0, hash_table_pointer_hash, hash_table_pointer_compare); } diff --git a/src/glsl/loop_controls.cpp b/src/glsl/loop_controls.cpp index 9eb1a8901b0..f2e1ecb904d 100644 --- a/src/glsl/loop_controls.cpp +++ b/src/glsl/loop_controls.cpp @@ -253,6 +253,10 @@ loop_control_visitor::visit_leave(ir_loop *ir) * satisfied. */ if_stmt->remove(); + + assert(ls->num_loop_jumps > 0); + ls->num_loop_jumps--; + this->progress = true; }