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

Datalight Inc.

С появлением Optimum-C Datalight стала одним из первых поставщиков,
предложивших оптимизирующий компилятор. Хотя набор тестов не подтвердил
наглядно претензии Datalight на глобальную оптимизацию, Optimum-C сработал
так хорошо в некоторых фрагментах теста, что он продемонстрировал слабые
фрагменты набора, требующие изменений для усовершенствования желаемой
проверки. Например, в первой версии функции jump_compression не возвращалось
значение, что делало все вычисления и присваивания в функции лишними.
Optimum-C выявил это и удалил большую часть кода функции, включая цепочку
переходов.
В тесте размножения констант и копий Optimum-C определил, что
присваивание i5 в обоих условных операторах является излишним по отношению к
последующим присваиваниям. Компилятор удалил не только эти присваивания, но
и условные операторы.
Неудовлетворительным оказалось удаление лишних сохранений значений
регистров. Optimum-C удалил одно лишнее присваивание, i=k5, в тесте
размножения констант и копий и лишнее присваивание в функции dead_code. Он
не удалил второе лишнее присваивание, i=2, в тесте размножения констант и
копий, и k=2, дублируемое присваивание.
Optimum-C - единственный компилятор, который пытался выполнить глубокое
удаление общих выражений. Проверка сгенерированного кода показала, что общее
выражение i5+i2 было перемещено выше первого базового блока условного
оператора, но не было удалено из второго.
Вне ограничений на стандартное использование регистров, накладываемых
семейством микропроцессоров 80x86, Optimum-C разумно использует регистры. В
функции jump_compression каждый передаваемый параметр был помещен в регистр.
Внутри тела функции не было ссылок в память, кроме начальной засылки в
регистры.
Одной важной областью, в которой компилятор Optimum-C требует
улучшений, является оптимизация циклов. Компилятор не пытается выполнять
вынесение инвариантного кода и удаление переменных индукции цикла.
Тест выполнения показал, что компилятор Datalight очень эффективно
управляет вводом/выводом getc/putc, а остальные тесты выполняются в
приемлемое время.

Lattice Inc.

Имеющий большую историю компилятор Lattice MS-DOS C последовательно
совершенствовался с каждой новой версией. Он известен как генератор
стабильного, предсказуемого кода и выполняет умеренную оптимизацию. Lattice
С выполняет снижение мощности, сжатие цепочки переходов и удаление общих
подвыражений. Он не удаляет дублирующиеся присваивания после теста
встроенных функций и лишние присваивания в функции dead_code. Хотя он не
генерирует никакого кода для недостижимого printf в функции dead_code,
компилятор Lattice C генерирует ненужный безусловный переход к LEAVE,
которая является следующей инструкцией.
Единственными сгенерированными машинно-зависимыми инструкциями были
ENTER и LEAVE, инструкции микропроцессоров 80x86 для прологов и эпилогов
функций. Это сомнительное благо, поскольку выполнение ENTER требует больше