Code Generation
Register Allocation
- Hypothetical code sequence:
 -  ...
- -- x and y are in registers (alive) before
 - t1 := x + 1;
 - t2 := y + t1;
 - t3 := y * t2;
 - z := x + t3;
 - -- want x and z to be in registers (alive) after
 - ...
  - -- x and y are in registers (alive) before
 
| x and y alive | |||||||
| x | y | z | t1 | t2 | t3 | ||
|---|---|---|---|---|---|---|---|
| * | * | ||||||
| x + 1; | * | * | |||||
| t1 := | * | * | * | ||||
| y + t1; | * | * | * | ||||
| t2 := | * | * | * | ||||
| y * t2; | * | * | * | ||||
| t3 := | * | * | |||||
| x + t3; | * | * | |||||
| z := | * | * | |||||
| * | * | ||||||
| x and z alive | |||||||
Register allocation can be treated as a graph-colouring problem.
Register Allocation Graph
- Vertices (variables):
 - x, y, z, t1, t2, t3
 - Edges (where (v1, v2) are alive at same times):
 - (x,y), (x,z), (x,t1), (x,t2), (x,t3),
- (y,t1), (y,t2)
  - (y,t1), (y,t2)
 - Possible register allocation (vertex colouring):
 - R1: x
- R2: y, z
 - R3: t1, t2, t3
  - R2: y, z
 - Other choices are possible but we need at least 3 registers, e.g.,
for a typical 2-address machine:  -- x in R1 and y in R2 load R3, R1 add R3, literal 1 -- t1 := x + 1 add R3, R2 -- t2 := y + t1 mult R3, R2 -- t3 := y * t2 load R2, R1 add R2, R3 -- z := x + t3 -- x in R1 and z in R2