Instruction sequence where control flow starts at the first instruction and ends at the last, without jumps (except at the last instruction).
Transformations in a basic block maintain the block semantics (considered as an atomic entity).
Direct evaluation of expressions using only literal and known values:
int *x = (int *)malloc(1024 * 4);
int y = 3;
int z = 20 * y + 10;
</c>
Becomes:
<c>
int *x = (int *)malloc(4096);
int y = 3;
int z = 70;
Using temporary variables to store common results:
d = c * (a + b)
e = (a + b) / 2
Becomes:
t = a + b
d = c * t
e = t / 2
for (i = 1; i < n; i++)
a[i] = b[i] + 10;
Becomes:
for (i = 1; i < (n/4)*4; i+=4) {
a[i] = b[i] + 10;
a[i+1] = b[i+1] + 10;
a[i+2] = b[i+2] + 10;
a[i+3] = b[i+3] + 10;
}
// rest of the cycle
for (; i < n; i++)
a[i] = b[i] + 10;
for (i = 1; i < n; i++) {
a[i] = b[i] + c * d;
e = g[k];
}
Becomes:
t = c * d;
for (i = 1; i < n; i++) {
a[i] = b[i] + t;
}
e = g[k];
for (i = 1; i < n; i++)
k = i * 4 + m;
Becomes:
k = m;
for (i = 1; i < n; i++)
k = k + 4;
xor eax,eax
instead of
mov 0,eax
x << 2 + x
instead of
x * 5
Reorder independent instructions in order to avoid register spilling.