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:
@@ -118,15 +118,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
hash_table *var_hash;
|
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
|
* Number of ir_loop_jump instructions that operate on this loop
|
||||||
*/
|
*/
|
||||||
@@ -139,7 +130,6 @@ public:
|
|||||||
|
|
||||||
loop_variable_state()
|
loop_variable_state()
|
||||||
{
|
{
|
||||||
this->max_iterations = -1;
|
|
||||||
this->num_loop_jumps = 0;
|
this->num_loop_jumps = 0;
|
||||||
this->contains_calls = false;
|
this->contains_calls = false;
|
||||||
this->var_hash = hash_table_ctor(0, hash_table_pointer_hash,
|
this->var_hash = hash_table_ctor(0, hash_table_pointer_hash,
|
||||||
|
@@ -183,24 +183,23 @@ loop_control_visitor::visit_leave(ir_loop *ir)
|
|||||||
return visit_continue;
|
return visit_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Figure out how many times the loop will run based on the iteration count
|
if (ls->limiting_terminator != NULL) {
|
||||||
* annotations made by loop analysis, and give the loop a normative bound
|
/* If the limiting terminator has an iteration count of zero, then we've
|
||||||
* if possible.
|
* proven that the loop cannot run, so delete it.
|
||||||
*/
|
*/
|
||||||
unsigned max_iterations =
|
int iterations = ls->limiting_terminator->iterations;
|
||||||
ls->max_iterations < 0 ? INT_MAX : ls->max_iterations;
|
if (iterations == 0) {
|
||||||
|
ir->remove();
|
||||||
|
this->progress = true;
|
||||||
|
return visit_continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ir->normative_bound >= 0)
|
/* If the limiting terminator has a lower iteration count than the
|
||||||
max_iterations = ir->normative_bound;
|
* normative loop bound (if any), then make this a normatively bounded
|
||||||
|
* loop with the new iteration count.
|
||||||
/* If the limiting terminator has a lower iteration count than we'd
|
*/
|
||||||
* previously inferred for this loop, then make the new iteration count the
|
if (ir->normative_bound < 0 || iterations < ir->normative_bound)
|
||||||
* normative bound for this loop.
|
ir->normative_bound = iterations;
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove the conditional break statements associated with all terminators
|
/* Remove the conditional break statements associated with all terminators
|
||||||
@@ -221,14 +220,6 @@ loop_control_visitor::visit_leave(ir_loop *ir)
|
|||||||
this->progress = true;
|
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;
|
return visit_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -236,14 +236,14 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
|
|||||||
return visit_continue;
|
return visit_continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterations = ls->max_iterations;
|
|
||||||
|
|
||||||
/* Don't try to unroll loops where the number of iterations is not known
|
/* Don't try to unroll loops where the number of iterations is not known
|
||||||
* at compile-time.
|
* at compile-time.
|
||||||
*/
|
*/
|
||||||
if (iterations < 0)
|
if (ir->normative_bound < 0)
|
||||||
return visit_continue;
|
return visit_continue;
|
||||||
|
|
||||||
|
iterations = ir->normative_bound;
|
||||||
|
|
||||||
/* Don't try to unroll loops that have zillions of iterations either.
|
/* Don't try to unroll loops that have zillions of iterations either.
|
||||||
*/
|
*/
|
||||||
if (iterations > (int) max_iterations)
|
if (iterations > (int) max_iterations)
|
||||||
|
Reference in New Issue
Block a user