Loop Unrolling

Loop unrolling inserts extra copies of a loop's body in a loop to reduce processor time executing a loop's overhead instructions for each iteration of the loop body. In other words, this optimization attempts to reduce the ratio of time that the processor executes a loop's completion test and branching instructions to the time the processor executes the loop's body. This optimization improves execution speed but increases code size.

The following table explains how to control the optimization for loop unrolling.
Table 1. Controlling loop unrolling
Turn control this option from here... use this setting
CodeWarrior IDE Choose Level 3 or Level 4 in the Optimization Level settings panel.
source code #pragma opt_unroll_loops on | off | reset
command line -opt level=3, -opt level=4

For example, in the following listing, the for loop's body is a single call to a function, otherfunc(). For each time the loop's completion test executes

  for (i = 0; i < MAX; ++i)
  
  

the function executes the loop body only once.

Listing: Before loop unrolling

const int MAX = 100;

void func_from(int* vec)

{

    int i;

    for (i = 0; i < MAX; ++i)

    {

        otherfunc(vec[i]);

    }

}

In the following listing, the compiler has inserted another copy of the loop body and rearranged the loop to ensure that variable i is incremented properly. With this arrangement, the loop's completion test executes once for every 2 times that the loop body executes.

Listing: After loop unrolling

const int MAX = 100;

void func_to(int* vec)

{

    int i;

    for (i = 0; i < MAX;)

    {

        otherfunc(vec[i]);

        ++i;

        otherfunc(vec[i]);

        ++i;

    }

}