Final Code Generation and Code Optimization
for ( i=0; i < N; i++) { base = &a[0]; crt = *(base + i);}
base = &a[0];for ( i=0; i < N; i++) { crt = *(base + i);}
original code optimized code
e1 = *(&a[0]+offset +i);e2 = *(&a[0]+offset +j);
tmp = &a[0]+offset; e1 = *(tmp +i);e2 = *(tmp +j);
original code optimized code
y = …x = y;b = x / 2;
y = …b = y / 2;
original code optimized code
if (1) x = y;else x = z;
x = y;
original code optimized code
Exercise: at which points are these variables live ?
prod,i,t1,t2,t3,t4,t5,t6,t7
• Rationale– A value in a register can be accessed much more
efficiently than one in memory, so we should try to keep (frequently used) values in registers…
– …but CPUs have a very limited number of registers
• Techniques– Local register allocation– Global register allocation
read A
D = A+1read BD = D+B
D = A+1read CD = D+C
print A,D
AA
BB CC
DD
Register Interference Graphnodes: symbolic registersedges: if nodes are simultaneously live R1R1 R2R2 R3R3
k-coloring, where k is the number of registers
AA
BB CC
DD
R1R1 R2R2 R3R3
AA
DD
{empty graph}
AA
DD
{empty graph}
AA
BB CC
DD
R1
R2
R1
R2
R3R3