*/
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
*/
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,
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 (ir->normative_bound >= 0)
- max_iterations = ir->normative_bound;
+ 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 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
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;
}
- 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)