loop_unroll: unroll loops with (lowered) breaks
authorLuca Barbieri <luca@luca-barbieri.com>
Tue, 7 Sep 2010 15:03:43 +0000 (17:03 +0200)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 13 Sep 2010 23:20:40 +0000 (16:20 -0700)
commit2cdbced10d98214616bcc5f960b21185c433d23b
tree0720ef1aeb31047bd7a9fdeffc9eabf892dad5a7
parent8f2214f4892acb994d13531d555196bd8f242dad
loop_unroll: unroll loops with (lowered) breaks

If the loop ends with an if with one break or in a single break unroll
it.  Loops that end with a continue will have that continue removed by
the redundant jump optimizer.  Likewise loops that end with an
if-statement with a break at the end of both branches will have the
break pulled out after the if-statement.

Loops of the form

   for (...) {
      do_something1();
      if (cond) {
 do_something2();
 break;
      } else {
 do_something3();
      }
   }

will be unrolled as

   do_something1();
   if (cond) {
      do_something2();
   } else {
      do_something3();
      do_something1();
      if (cond) {
 do_something2();
      } else {
 do_something3();
 /* Repeat inserting iterations here.*/
      }
   }

ir_lower_jumps can guarantee that all loops are put in this form
and thus all loops are now potentially unrollable if an upper bound
on the number of iterations can be found.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/loop_unroll.cpp