Implement new heuristic for complete loop unrolling.

Complete loop unrolling can make some loads constant, thus enabling a

lot of other optimizations. To catch such cases, we look for loads that

might become constants and estimate number of instructions that would be

simplified or become dead after substitution.

Example:

Suppose we have:

int a[] = {0, 1, 0};

v = 0;

for (i = 0; i < 3; i ++)

v += b[i]*a[i];

If we completely unroll the loop, we would get:

v = b[0]*a[0] + b[1]*a[1] + b[2]*a[2]

Which then will be simplified to:

v = b[0]* 0 + b[1]* 1 + b[2]* 0

And finally:

v = b[1]