Loop unswitching

From Vero - Wikipedia
Jump to navigation Jump to search

Template:Short description Loop unswitching is a compiler optimization. It moves a conditional statement inside a loop outside by duplicating the loop's body and placing a version of it inside each of the if and else clauses of the conditional.<ref>Template:Cite book</ref> This enhances loop's parallelization. As modern processors can efficiently handle vectors, this optimization increases program speed.

Here is a simple example. Suppose we want to add the two arrays x and y and also do something depending on the variable w. We have the following C code:

<syntaxhighlight lang=c> bool w; int x[1000]; int y[1000]; for (int i = 0; i < 1000; i++) {

  x[i] += y[i];
  if (w) {
     y[i] = 0;
  }

} </syntaxhighlight>

The conditional inside this loop makes it difficult to safely parallelize this loop. When we unswitch the loop, this becomes:

<syntaxhighlight lang=c> bool w; int x[1000]; int y[1000]; if (w) {

   for (int i = 0; i < 1000; i++) {
       x[i] += y[i];
       y[i] = 0;
   }

} else {

   for (int i = 0; i < 1000; i++) {
       x[i] += y[i];
   }

} </syntaxhighlight>

While the loop unswitching may double the amount of code written, each of these new loops may now be separately optimized.

Loop unswitching was introduced in gcc in version 3.4.<ref>Template:Cite web</ref>

References

Template:Reflist

Template:Compiler optimizations