Warum kann (oder kann) der Compiler eine vorhersagbare Additionsschleife nicht in eine Multiplikation optimieren?

Dies ist eine Frage, die mir beim Lesen der brillanten Antwort von in den Sinn kamMystisch zur Frage:Warum ist es schneller, ein sortiertes Array zu verarbeiten als ein unsortiertes Array??

Kontext für die beteiligten Typen:

const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;

In seiner Antwort erklärt er, dass der Intel Compiler (ICC) dies optimiert:

for (int i = 0; i < 100000; ++i)
    for (int c = 0; c < arraySize; ++c)
        if (data[c] >= 128)
            sum += data[c];

... in etwas Äquivalentes:

for (int c = 0; c < arraySize; ++c)
    if (data[c] >= 128)
        for (int i = 0; i < 100000; ++i)
            sum += data[c];

Der Optimierer erkennt, dass diese äquivalent sind und daher sindaustausch der schleifenBewegen Sie den Zweig außerhalb der inneren Schleife. Sehr schlau!

Aber warum macht es das nicht?

for (int c = 0; c < arraySize; ++c)
    if (data[c] >= 128)
        sum += 100000 * data[c];

Hoffentlich kann Mysticial (oder jemand anderes) eine ebenso brillante Antwort geben. Ich habe noch nie etwas über die Optimierungen erfahren, die in dieser anderen Frage besprochen wurden, deshalb bin ich sehr dankbar dafür.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage