Loop splitting is a compiler optimization technique. It attempts to simplify a loop or eliminate dependencies by breaking it into multiple loops which have the same bodies but iterate over different contiguous portions of the index range.

Loop peeling

Loop peeling is a special case of loop splitting which splits any problematic first (or last) few iterations from the loop and performs them outside of the loop body.

Suppose a loop was written like this:

<syntaxhighlight lang="c">

int p = 10;

for (int i = 0; i < 10; ++i) {

y[i] = x[i] + x[p];

p = i;

}

</syntaxhighlight>

Notice that <code>p = 10</code> only for the first iteration, and for all other iterations, <code>p = i - 1</code>. A compiler can take advantage of this by unwinding (or "peeling") the first iteration from the loop.

After peeling the first iteration, the code would look like this:

<syntaxhighlight lang="c">

y[0] = x[0] + x[10];

for (int i = 1; i < 10; ++i) {

y[i] = x[i] + x[i - 1];

}

</syntaxhighlight>

This equivalent form eliminates the need for the variable <code>p</code> inside the loop body.

Loop peeling was introduced in gcc in version 3.4. More generalised loop splitting was added in GCC 7.

Further reading