"Филипп Н.Хислей. Генерация высококачественного кода для программ, написанных на СИ " - читать интересную книгу автора

Оптимизирующие преобразования могут быть зависящими или независящими от
архитектуры компьютера. Процесс компиляции компьютерной программы включает
два основных действия: синтаксический/семантический анализ и генерацию кода.
Синтаксический/семантический анализ существенно зависит от грамматики и
специфичен для языка. Генерация кода является общей и прекрасно может быть
использована для поддержки первой стадии для любого количества языков
программирования.
Исходный текст конкретного языка первым делом транслируется в общую
промежуточную форму, которая последовательно обрабатывается для выработки на
стадии генерации машинно-зависимого кода. Машинно-независимая оптимизация,
такая как выделение общих подвыражений и вынесение инвариантного кода,
применяется к промежуточному коду. Машинно-зависимая оптимизация применяется
к результату стадии генерации кода и использует набор команд конкретного
процессора. Эта оптимизация известна как "щелевая" оптимизация, потому что
эти преобразования выполняются внутри маленького окна (5 - 10 инструкций
машинного уровня). Типичные примеры щелевой оптимизации включают удаление
излишних операций загрузки/сохранения регистров, удаление недостижимого
кода, выпрямление передач управления, алгебраические упрощения, снижение
мощности (команд) и использование команд, специфических для конкретного
процессора.

Методы оптимизации

Существуют различные методы машинно-зависимой и машинно-независимой
оптимизации кода. Они могут применяться на всех синтаксических уровнях.
Одним из простейших методов является "размножение констант". При его
применении любая ссылка на константное значение замещается самим значением.
В следующем примере повышается эффективность благодаря удалению трех
адресных ссылок и замене их константами:
x = 2;
if( a " x && b " x)
c = x;s
переводится в
x = 2;
if(a " 2 && b " 2)
c = 2;
Целиком связано с размножением констант "размножение копий". В этом
методе копируются переменные вместо константных значений. Например,
x = y;
if(a " x && b " x)
c = x;
переводится в
x = y;
if(a " y && b " y)
c = y;
Размножение констант и копий также может удалить излишние присваивания
(x = 2 и x = y в примерах). Среди описываемых компиляторов только Microsoft
C 5.0 и WATCOM C 6.0 применяют размножение констант.
Метод "свертки констант" (константная арифметика) сводит выражения,
которые содержат константные данные, к возможно простейшей форме.