Рассмотрим в качестве примера фрагмент программы на Фортране:
DO 10 I = 1, 20
10 TABLE (I) = 2 ** I
Цикл DO порождает таблицу, содержащую первые 20 степеней двойки.
На уровне машинного кода операция возведения в степень представляет собой либо цикл, осуществляющий последовательность умножений, либо вызов подпрограммы, использующий логарифмы.
Существует более эффективный способ этих вычислений. Величина 2**I для текущего прохода по циклу может быть получена путем умножения на 2 значения, полученного на предыдущем проходе.
Подобные модификации могут быть осуществлены при вычислении относительного адреса элемента массива TABLE (I).
Если каждый элемент массива занимает 2 байта, то смещение вычисляется по формуле 2*(I - 1).
Dычисление требуемого смещения может быть получено путем сложения предыдущего смещения с 2. Поскольку сложение выполняется быстрее умножения, подобное преобразование приведет к более эффективному объектному коду.
Свёртка операндов
Значение подвыражений могут быть вычислены непосредственно компилятором, если значения их операндов известны в момент компиляции.
Пример:
При компиляции предложений:
S:= ’TE’+’XT’;
X:= 3 + Length(S)*2;
будет скомпилирован код эквивалентный
S:= ’TEXT’;
X:= 11;
Если выражением индекса массива была константа, то адрес элемента вычисляется во время компиляции. Доступ к элементу массива A[5,5] будет таким же эффективным, как доступ к отдельной переменной.
Короткое вычисление выражений
При коротком вычислении логических выражений код генерируется таким образом, что операция логического сложения (OR) не вычисляется, если один из операндов имеет значение ИСТИНА.
Аналогично:
- операция логического умножения (AND) не вычисляется, если один из операндов имеет значение ЛОЖЬ.
- операция умножения (*) не вычисляется, если один из операндов имеет значение 1.
- операция сложения не вычисляется, если один из операндов имеет значение 0.
Сдвиг вместо умножения
Операция X*C может быть заменена на X shl Y, если С = 2Y.
Аналогично, если размер элементов массива равен степени 2, то для вычисления индекса массива используется инструкция SHL, а не MUL.
Другие методы машинно-независимой оптимизации кода включают в себя преобразование цикла в линейный участок (развертывание цикла), слияния тел различных циклов, исключение невыполняемого кода, оптимизация передачи параметров в процедуры и функции и т.д.