glsl/loops: Get rid of loop_variable_state::max_iterations.

This value is now redundant with
loop_variable_state::limiting_terminator->iterations and
ir_loop::normative_bound.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Paul Berry
2013-11-29 00:11:12 -08:00
parent e734c9f677
commit 4d844cfa56
3 changed files with 19 additions and 38 deletions

View File

@@ -118,15 +118,6 @@ public:
*/
hash_table *var_hash;
/**
* Maximum number of loop iterations.
*
* If this value is negative, then the loop may be infinite. This actually
* means that analysis was unable to determine an upper bound on the number
* of loop iterations.
*/
int max_iterations;
/**
* Number of ir_loop_jump instructions that operate on this loop
*/
@@ -139,7 +130,6 @@ public:
loop_variable_state()
{
this->max_iterations = -1;
this->num_loop_jumps = 0;
this->contains_calls = false;
this->var_hash = hash_table_ctor(0, hash_table_pointer_hash,

View File

@@ -183,24 +183,23 @@ loop_control_visitor::visit_leave(ir_loop *ir)
return visit_continue;
}
/* Figure out how many times the loop will run based on the iteration count
* annotations made by loop analysis, and give the loop a normative bound
* if possible.
*/
unsigned max_iterations =
ls->max_iterations < 0 ? INT_MAX : ls->max_iterations;
if (ls->limiting_terminator != NULL) {
/* If the limiting terminator has an iteration count of zero, then we've
* proven that the loop cannot run, so delete it.
*/
int iterations = ls->limiting_terminator->iterations;
if (iterations == 0) {
ir->remove();
this->progress = true;
return visit_continue;
}
if (ir->normative_bound >= 0)
max_iterations = ir->normative_bound;
/* If the limiting terminator has a lower iteration count than we'd
* previously inferred for this loop, then make the new iteration count the
* normative bound for this loop.
*/
if (ls->limiting_terminator != NULL &&
(unsigned) ls->limiting_terminator->iterations < max_iterations) {
ir->normative_bound = ls->limiting_terminator->iterations;
max_iterations = ls->limiting_terminator->iterations;
/* If the limiting terminator has a lower iteration count than the
* normative loop bound (if any), then make this a normatively bounded
* loop with the new iteration count.
*/
if (ir->normative_bound < 0 || iterations < ir->normative_bound)
ir->normative_bound = iterations;
}
/* Remove the conditional break statements associated with all terminators
@@ -221,14 +220,6 @@ loop_control_visitor::visit_leave(ir_loop *ir)
this->progress = true;
}
/* If we have proven the one of the loop exit conditions is satisifed before
* running the loop once, remove the loop.
*/
if (max_iterations == 0)
ir->remove();
else
ls->max_iterations = max_iterations;
return visit_continue;
}

View File

@@ -236,14 +236,14 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
return visit_continue;
}
iterations = ls->max_iterations;
/* Don't try to unroll loops where the number of iterations is not known
* at compile-time.
*/
if (iterations < 0)
if (ir->normative_bound < 0)
return visit_continue;
iterations = ir->normative_bound;
/* Don't try to unroll loops that have zillions of iterations either.
*/
if (iterations > (int) max_iterations)