### 11.9 Linear loop transformations framework

Lambda is a framework that allows transformations of loops using non-singular matrix based transformations of the iteration space and loop bounds. This allows compositions of skewing, scaling, interchange, and reversal transformations. These transformations are often used to improve cache behavior or remove inner loop dependencies to allow parallelization and vectorization to take place.

To perform these transformations, Lambda requires that the loopnest be converted into a internal form that can be matrix transformed easily. To do this conversion, the function `gcc_loopnest_to_lambda_loopnest` is provided. If the loop cannot be transformed using lambda, this function will return NULL.

Once a `lambda_loopnest` is obtained from the conversion function, it can be transformed by using `lambda_loopnest_transform`, which takes a transformation matrix to apply. Note that it is up to the caller to verify that the transformation matrix is legal to apply to the loop (dependence respecting, etc). Lambda simply applies whatever matrix it is told to provide. It can be extended to make legal matrices out of any non-singular matrix, but this is not currently implemented. Legality of a matrix for a given loopnest can be verified using `lambda_transform_legal_p`.

Given a transformed loopnest, conversion back into gcc IR is done by `lambda_loopnest_to_gcc_loopnest`. This function will modify the loops so that they match the transformed loopnest.