3.1.3 Global optimisations 3.1.3.1 Restructuring 3.1.3.2 Merging 3.1.3.2.1 Forward merging 3.1.3.2.2 Backward merging 3.1.3.3 Advancing 3.1.3.4 Factoring 3.1.3.5 Loop optimisations 3.1.3.5.1 Iteration 3.1.3.5.2 Holding 3.1.3.5.3 Removal of invariants 3.1.3.6 Expansion 3.1.3.7 Addressing optimisations 3.1.4 Source optimisations 3.2 Combination of optimisations 4 The design of the compiler 4.1 General structure 4.2 The intermediate code 4.2.1 Objectives 4.2.1.1 Scope 4.2.1.2 Information preservation 4.2.1.3 Target machine independence 4.2.1.4 Decision binding 4.2.1.5 Simplification 4.2.1.6 Redundancy 4.2.1.7 Ease of use