 
 
 
 
 
 
 
  
After all the instructions have been generated and all the missing information has been added to Mode, it is time to go through the instructions again and eliminate all the redundancies before any code is generated. This is achieved via a process called peephole optimization as follows. Starting at the top, ALE looks at pairs of instructions and try to either eliminate one or merge the two together. Then it moves down by one instruction and does the same to the next pair until it has considered all instructions.
| type Path, Type1 |  | type Path, (Type1  Type2) | 
| type Path, Type2 | 
Given two instructions type Path,Type1 and type
    Path,Type2, we know that the two types Type1 and     Type2 must be unifiable because they share the same path;
  therefore, we can merge the two instructions into one: type
    Path, (Type1  Type2).
 Type2).
| type Path, Type |  | ...Path ... | 
| ...Path ... | 
Given the instruction type Path, Type and another instruction
  containing Path to a feature F, we can eliminate the
  first instruction because we know Type  intro(F).
  This means that when trying to get the value of F by a
  post-order traversal of Path, ALE has to process the
  instruction type Path, Type anyway.
 intro(F).
  This means that when trying to get the value of F by a
  post-order traversal of Path, ALE has to process the
  instruction type Path, Type anyway.
 
 
 
 
 
 
