Restructuring loops involves rewriting loops so they will execute more efficiently, often by reducing loop overhead or improving scheduling of instructions in loops. Examples include loop fusion and loop unrolling. Optimizations of nested loops includes changing loop nests to access cache in a more efficient manner. Examples include loop interchange, loop blocking or tiling, outer loop unrolling inside inner loops. Optimizations of conditional statements in loops.
Conditional branches can be very slow on superscalar systems.
Optimizations of expressions. Some expressions can be rewritten to expose common sub-expressions or improve compiler code generation. Inline expansion reduces calling overhead and assists other kinds of optimization by inserting the bodies of called functions at the places they are called. Functions can be inlined from different source files. Memory and cache optimizations involving changing the dimensioning of arrays and global variables to avoid poor mapping onto the cache structure.