summaryrefslogtreecommitdiffstats
path: root/src/glsl/loop_controls.cpp
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2013-11-28 08:13:41 -0800
committerPaul Berry <[email protected]>2013-12-09 10:54:33 -0800
commite00b93a1f7b4bc7f5e887591c000524e13f80826 (patch)
tree4bfdfa0f56747019aed8c427fb3349adc1e53e7e /src/glsl/loop_controls.cpp
parent2c17f97fe6a40e4a963fb4eec0ea0555f562b1be (diff)
glsl/loops: replace loop controls with a normative bound.
This patch replaces the ir_loop fields "from", "to", "increment", "counter", and "cmp" with a single integer ("normative_bound") that serves the same purpose. I've used the name "normative_bound" to emphasize the fact that the back-end is required to emit code to prevent the loop from running more than normative_bound times. (By contrast, an "informative" bound would be a bound that is informational only). Reviewed-by: Jordan Justen <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl/loop_controls.cpp')
-rw-r--r--src/glsl/loop_controls.cpp21
1 files changed, 8 insertions, 13 deletions
diff --git a/src/glsl/loop_controls.cpp b/src/glsl/loop_controls.cpp
index 0eb103f49b8..a1dc20e7198 100644
--- a/src/glsl/loop_controls.cpp
+++ b/src/glsl/loop_controls.cpp
@@ -187,13 +187,11 @@ loop_control_visitor::visit_leave(ir_loop *ir)
* i is a loop induction variable, c is a constant, and < is any relative
* operator.
*/
- int max_iterations = ls->max_iterations;
+ unsigned max_iterations =
+ ls->max_iterations < 0 ? INT_MAX : ls->max_iterations;
- if(ir->from && ir->to && ir->increment)
- max_iterations = calculate_iterations(ir->from, ir->to, ir->increment, (ir_expression_operation)ir->cmp);
-
- if(max_iterations < 0)
- max_iterations = INT_MAX;
+ if (ir->normative_bound >= 0)
+ max_iterations = ir->normative_bound;
foreach_list(node, &ls->terminators) {
loop_terminator *t = (loop_terminator *) node;
@@ -248,14 +246,11 @@ loop_control_visitor::visit_leave(ir_loop *ir)
cmp);
if (iterations >= 0) {
/* If the new iteration count is lower than the previously
- * believed iteration count, update the loop control values.
+ * believed iteration count, then add a normative bound to
+ * this loop.
*/
- if (iterations < max_iterations) {
- ir->from = init->clone(ir, NULL);
- ir->to = limit->clone(ir, NULL);
- ir->increment = lv->increment->clone(ir, NULL);
- ir->counter = lv->var->clone(ir, NULL);
- ir->cmp = cmp;
+ if ((unsigned) iterations < max_iterations) {
+ ir->normative_bound = iterations;
max_iterations = iterations;
}