fbpx
Wikipedia

Loop-invariant code motion

In computer programming, loop-invariant code consists of statements or expressions (in an imperative programming language) that can be moved outside the body of a loop without affecting the semantics of the program. Loop-invariant code motion (also called hoisting or scalar promotion) is a compiler optimization that performs this movement automatically.

Example

In the following code sample, two optimizations can be applied.

int i = 0; while (i < n) {  x = y + z;  a[i] = 6 * i + x * x;  ++i; } 

Although the calculation x = y + z and x * x is loop-invariant, precautions must be taken before moving the code outside the loop. It is possible that the loop condition is false (for example, if n holds a negative value), and in such case, the loop body should not be executed at all. One way of guaranteeing correct behaviour is using a conditional branch outside of the loop. Evaluating the loop condition can have side effects, so an additional evaluation by the if construct should be compensated by replacing the while loop with a do {} while. If the code used do {} while in the first place, the whole guarding process is not needed, as the loop body is guaranteed to execute at least once.

int i = 0; if (i < n) {  x = y + z;  int const t1 = x * x;  do {  a[i] = 6 * i + t1;  ++i;  } while (i < n); } 

This code can be optimized further. For example, strength reduction could remove the two multiplications inside the loop (6*i and a[i]), and induction variable elimination could then elide i completely. Since 6 * i must be in lock step with i itself, there is no need to have both.

Invariant code detection

Usually, a reaching definitions analysis is used to detect whether a statement or expression is loop invariant.

For example, if all reaching definitions for the operands of some simple expression are outside of the loop, the expression can be moved out of the loop.

Recent work using data-flow dependence analysis [1] allows to detect not only invariant commands but larger code fragments such as an inner loop. The analysis also detects quasi-invariants of arbitrary degrees, that is commands or code fragments that become invariant after a fixed number of iterations of the loop body.

Benefits

Loop-invariant code which has been hoisted out of a loop is executed less often, providing a speedup. Another effect of this transformation is allowing constants to be stored in registers and not having to calculate the address and access the memory (or cache line) at each iteration.

However, if too many variables are created, there will be high register pressure, especially on processors with few registers, like the 32-bit x86. If the compiler runs out of registers, some variables will be spilled. To counteract this, the inverse optimization can be performed, rematerialization.

See also

Further reading

  • Aho, Alfred V.; Sethi, Ravi; & Ullman, Jeffrey D. (1986). Compilers: Principles, Techniques, and Tools. Addison Wesley. ISBN 0-201-10088-6.

References

  1. ^ Moyen, Jean-Yves; Rubiano, Thomas; Seiller, Thomas (2017). "Loop Quasi-Invariant Chunk Detection". Automated Technology for Verification and Analysis. Lecture Notes in Computer Science. 10482: 91–108. doi:10.1007/978-3-319-68167-2_7. ISBN 978-3-319-68166-5.

External links

    loop, invariant, code, motion, this, article, needs, additional, citations, verification, please, help, improve, this, article, adding, citations, reliable, sources, unsourced, material, challenged, removed, find, sources, news, newspapers, books, scholar, jst. This article needs additional citations for verification Please help improve this article by adding citations to reliable sources Unsourced material may be challenged and removed Find sources Loop invariant code motion news newspapers books scholar JSTOR January 2021 Learn how and when to remove this template message In computer programming loop invariant code consists of statements or expressions in an imperative programming language that can be moved outside the body of a loop without affecting the semantics of the program Loop invariant code motion also called hoisting or scalar promotion is a compiler optimization that performs this movement automatically Contents 1 Example 2 Invariant code detection 3 Benefits 4 See also 5 Further reading 6 References 7 External linksExample EditIn the following code sample two optimizations can be applied int i 0 while i lt n x y z a i 6 i x x i Although the calculation x y z and x x is loop invariant precautions must be taken before moving the code outside the loop It is possible that the loop condition is false for example if n holds a negative value and in such case the loop body should not be executed at all One way of guaranteeing correct behaviour is using a conditional branch outside of the loop Evaluating the loop condition can have side effects so an additional evaluation by the if construct should be compensated by replacing the while loop with a a href Do while loop html title Do while loop do while a If the code used do while in the first place the whole guarding process is not needed as the loop body is guaranteed to execute at least once int i 0 if i lt n x y z int const t1 x x do a i 6 i t1 i while i lt n This code can be optimized further For example strength reduction could remove the two multiplications inside the loop 6 i and a i and induction variable elimination could then elide i completely Since 6 i must be in lock step with i itself there is no need to have both Invariant code detection EditUsually a reaching definitions analysis is used to detect whether a statement or expression is loop invariant For example if all reaching definitions for the operands of some simple expression are outside of the loop the expression can be moved out of the loop Recent work using data flow dependence analysis 1 allows to detect not only invariant commands but larger code fragments such as an inner loop The analysis also detects quasi invariants of arbitrary degrees that is commands or code fragments that become invariant after a fixed number of iterations of the loop body Benefits EditLoop invariant code which has been hoisted out of a loop is executed less often providing a speedup Another effect of this transformation is allowing constants to be stored in registers and not having to calculate the address and access the memory or cache line at each iteration However if too many variables are created there will be high register pressure especially on processors with few registers like the 32 bit x86 If the compiler runs out of registers some variables will be spilled To counteract this the inverse optimization can be performed rematerialization See also EditCode motion Loop invariantFurther reading EditAho Alfred V Sethi Ravi amp Ullman Jeffrey D 1986 Compilers Principles Techniques and Tools Addison Wesley ISBN 0 201 10088 6 References Edit Moyen Jean Yves Rubiano Thomas Seiller Thomas 2017 Loop Quasi Invariant Chunk Detection Automated Technology for Verification and Analysis Lecture Notes in Computer Science 10482 91 108 doi 10 1007 978 3 319 68167 2 7 ISBN 978 3 319 68166 5 External links EditCompiler Optimizations Hoisting Retrieved from https en wikipedia org w index php title Loop invariant code motion amp oldid 1120709508, wikipedia, wiki, book, books, library,

    article

    , read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.