On 19/10/2023 17:11, Kai Song via Gcc-help wrote:
(It can be helpful to include attributions when replying, so that it is
clear who wrote what. Thus you should have this line included:)
> On 19/10/2023 16:26, Jonathan Wakely via Gcc-help wrote:
Nothing you have said actually explains why you can't refactor the
code into utility functions that avoid doing everything in one huge
function.
Because there are no two pieces of code that are exactly identical. The
relative distance of two variables being involved into an identical formula
will change with every line.
Example:
Line 1000: tmp[100]=foo(tmp[101],tmp[102]);
Line 2000: tmp[200]=foo(tmp[201],tmp[203]); // dang it, not tmp[202] but
tmp[203]
It is like with penrose tiling. It seems all identical but the details
break it. You just do not find two identical local areas. No-where. And if,
you have to particularly search for them by brute-force, and that should
become useless whenever the particular pattern you try to find does just
not exist in that particular user's instance.
Surely this is screaming out for a table?
const int foo_table[][3] = {
{ 100, 101, 102 },
{ 200, 201, 203 },
...
};
for (int i = 0; i < 100000000; i++) {
tmp[foo_table[i][0]] =
foo(tmp[foo_table[i][1]], tmp[foo_table[i][2]]);
}
This will turn your million-line program into a four line program with a
big table, which will compile quickly and run faster.