title: Loop inversion
text: # Loop inversion
  
  In computer science, loop inversion is a compiler optimization and loop transformation in which a while loop is replaced by an if block containing a do..while loop. When used correctly, it may improve performance due to instruction pipelining.
  
  ## Example in C
  
  is equivalent to:
  
  Despite the seemingly greater complexity of the second example, it may actually run faster on modern CPUs because they use an instruction pipeline. By nature, any jump in the code causes a pipeline stall, which is a detriment to performance.
  
  Additionally, loop inversion allows safe loop-invariant code motion.
  
  ## Example in three-address code
  
  If i had been initialized at 100, the instructions executed at runtime would have been:
  
  Let us assume that i had been initialized to some value less than 100. Now let us look at the instructions executed at the moment after i has been incremented to 99 in the loop:
  
  Now, let's look at the optimized version:
  
  Again, let's look at the instructions executed if i is initialized to 100:
  
  We didn't waste any cycles compared to the original version. Now consider the case where i has been incremented to 99:
  
  As you can see, two gotos (and thus, two pipeline stalls) have been eliminated in the execution.
  
  