There are many papers on reordering frameworks for perfectly nested loops [Ban93][Ram92][KKB92][LP92][WL91][Ban90]. These approaches cannot handle imperfectly nested loops or represent transformations such as distribution, fusion and statement ordering.
The use of different schedules for each statement was suggested by [Lu91], but this paper did not include any discussion of how to check such schedules for legality, generate schedules or produce transformed code corresponding to schedules. Darte and Robert [DR92c][DR92a][DR92b] and Feautrier [Fea92b][Fea92a] examined the use of different schedules for each statement and methods for deriving schedules that have optimal parallelism. However, these methods cannot be used to optimize for locality or other considerations. Jean-François Collard and Paul Feautrier have done work [Col93][CFR93] on generating code when each statement has its own schedule, but their techniques generate code with more overhead than ours [KP93b].