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

(см. рис. 4 и 5).
Простой пример цикла в коде теста демонстрирует степень оптимизации
циклов, выполняемой Microsoft C 5.0 (см. рис. 3). Компилятор применяет
снижение мощности и полностью удаляет константное умножение, выявляет
конечное состояние переменных j5 и k5, и помещает в регистры все переменные
внутри цикла.
Другой хороший пример оптимизации циклов этим компилятором отражен в
функции unnecessary_loop. C 5.0 удаляет цикл for и генерирует код только с
целью установки конечного состояния переменной - индекса цикла и оператора,
включенного в цикл. Компилятор также хорошо использует регистры.
Внимание фирмы Microsoft к оптимизации вознаграждается при работе теста
выполнения. Он выполняется за время, которое является лучшим или близко к
лучшему по каждой категории.

Microsoft QuickC.

Когда речь идет об оптимизации, QuickC становится настолько
беспомощным, насколько C 5.0 изощренным. Код, сгенерированный QuickC, был в
основном дословным переводом, насыщенным излишними загрузками и сохранениями
регистров, переходами на переходы. Этот компилятор применяет лишь наиболее
первичные методы оптимизации, свертку констант и некоторые алгебраические
упрощения. Он сгенерировал недостижимый код, поместил переход через него и
не смог выполнить сжатие цепочки переходов.
В пользу компилятора свидетельствует то, что что он разумно управляет
прологами и эпилогами функций, используя отдельные инструкции для установки
адресации стекового фрейма при входе и инструкцию LEAVE при завершении
функции. При входе сохраняются и при выходе восстанавливаются только те
регистры, которые используются в теле функции.
QuickC был влючен в этот обзор, потому что он имеет ключ оптимизации в
командной строке (-Ox). Генерируя код, который по своей природе - дословный
перевод исходного текста, QuickC был разработан исключительно как быстрый
прототип компилятора, но не как оптимизирующий компилятор.

WATCOM.

Новейший соперник, завоевывающий позиции на рынке компиляторов C -
WATCOM C 6.0 (см. Product Watch, Philip N. Hisley, за этот месяц). C 6.0
вырабатывает компактный код, который прекрасно использует несколько
ограниченный комплект регистров семейства 80x86. Кроме выполнения базовых
приемов оптимизации, он поддерживает снижение мощности и удаление
недостижимого кода и общих подвыражений. В то время, как Microsoft достигает
улучшения кода благодаря оптимизации циклов, WATCOM увеличивает скорость
путем уменьшения управляющих заголовков вызовов функций к их абсолютно
минимальному размеру. Он достигает этого путем преимущественной передачи
параметров через регистры, а не через стек.
WATCOM очень хорошо удаляет недостижимый код. C 6.0 не только удалил
ненужные присваивания и недостижимый код внутри функции, но он также удалил
пролог и эпилог функции и свернул всю функцию к простому возврату, приписав
имя функции к инструкции возврата основной функции. В завершение всего,
компилятор удалил локальный вызов функции.