diff options
author | Paul Berry <stereotype441@gmail.com> | 2013-11-28 08:13:41 -0800 |
---|---|---|
committer | Paul Berry <stereotype441@gmail.com> | 2013-12-09 10:54:33 -0800 |
commit | e00b93a1f7b4bc7f5e887591c000524e13f80826 (patch) | |
tree | 4bfdfa0f56747019aed8c427fb3349adc1e53e7e /src/glsl/loop_controls.cpp | |
parent | 2c17f97fe6a40e4a963fb4eec0ea0555f562b1be (diff) | |
download | external_mesa3d-e00b93a1f7b4bc7f5e887591c000524e13f80826.zip external_mesa3d-e00b93a1f7b4bc7f5e887591c000524e13f80826.tar.gz external_mesa3d-e00b93a1f7b4bc7f5e887591c000524e13f80826.tar.bz2 |
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 <jordan.l.justen@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Diffstat (limited to 'src/glsl/loop_controls.cpp')
-rw-r--r-- | src/glsl/loop_controls.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/src/glsl/loop_controls.cpp b/src/glsl/loop_controls.cpp index 0eb103f..a1dc20e 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; } |