Code motion techniques are integrated in many optimizing production and research compilers. They are still a major topic of ongoing research in program optimization, but traditional methods are restricted by a narrow focus on their immediate effects. A more ambitious approach is to investigate the interdependencies between distinct component transformations. This monograph provides a comprehensive account of the methods most accepted in practice for program analysis and program transformation for imperative languages. It also develops a scenario, systematically and step by step, which overcomes the structural restrictions that had previously long resisted attack. The author presents formal proofs for all the steps leading to this breakthrough, though the reader may skip the proofs and consult the technical details as needed yet still enjoy a smooth introduction to the central principles of code motion.