The FORTRAN 77, Fortran 90, and C compilers perform extensive automatic restructuring of source code, exposing higher degrees of loop-level parallelization. Some of the techniques the compilers use for this transformation are:
Loop distribution. Separating statements that can execute in parallel from those that cannot
Loop fusion. Combining several small, adjacent loops into a single parallel loop, reducing execution overhead
Loop interchange. Interchanging nested loops to produce a loop that can be parallelized with significantly less overhead
Scalar and array privatization. Using multiple copies of a scalar or array variable to, parallelize a loop that has data dependency