No subject

=3D?UTF-8?q?Mathias=3D20Fr=3DC3=3DB6hlich?=3D Mathias.Froehlich at =
Sun Jan 29 22:15:05 PST 2012


gmx.net>
Date: Wed, 25 Jan 2012 17:35:01 +0100
Subject: [PATCH] glsl: Avoid excessive loop unrolling.
MIME-Version: 1.0
Content-Type: text/plain; charset=3DUTF-8
Content-Transfer-Encoding: 8bit

Avoid unrollong loops that are either nested loops or
where the loop body times the unroll count is huge.

The change is far from being perfect but it extends the
loop unrolling decision heuristic by some additional
safeguard. In particular this cuts down compilation of
a shader precomputing atmospheric scattering integral
tables containing two nesting levels in a loop from
something way beyond some minutes (I never waited for
it to finish) to some fractions of a second.

Signed-off-by: Mathias Fr=C3=B6hlich <Mathias.Froehlich at web.de>
---
 src/glsl/loop_unroll.cpp |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/src/glsl/loop_unroll.cpp b/src/glsl/loop_unroll.cpp
index 5b84e10..d0bcaa6 100644
--- a/src/glsl/loop_unroll.cpp
+++ b/src/glsl/loop_unroll.cpp
@@ -56,6 +56,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
 {
    loop_variable_state *const ls =3D this->state->get(ir);
    int iterations;
+   unsigned ir_count;
=20
    /* If we've entered a loop that hasn't been analyzed, something rea=
lly,
     * really bad has happened.
@@ -78,6 +79,20 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
    if (iterations > (int) max_iterations)
       return visit_continue;
=20
+   /* Don't try to unroll nested loops and loops with a huge body.
+    */
+   ir_count =3D 0;
+   foreach_list(node, &ir->body_instructions) {
+      ++ir_count;
+
+      /* If the loop body gets to huge, do not unroll. */
+      if (5*max_iterations < ir_count*iterations)
+          return visit_continue;
+      /* Do not unroll loops with child loop nodes. */
+      if (((ir_instruction *) node)->as_loop())
+          return visit_continue;
+   }
+
    if (ls->num_loop_jumps > 1)
       return visit_continue;
    else if (ls->num_loop_jumps) {
--=20
1.7.7.6


--nextPart1573045.OCfQecQsVT--



More information about the mesa-dev mailing list