¦Слияние циклов ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
+-------------------------+---+---+---+---+---+---+---+---+---+
¦ 1 - BORLAND Turbo C 1.5, 2 - COMPUTER INNOVATIONS ¦
¦ C86Plus 1.1, 3 - DATALIGHT Optimum-C 3.14, 4 - LATTICE ¦
¦ MS-DOS C 3.2, 5 - MANX Aztec C 4.0, 6 - METAWARE High C ¦
¦ 1.4, 7 - MICROSOFT C 5.0, 8 - MICROSOFT QuickC 1.0, 9 - ¦
¦ WATCOM C 6.0. ¦
¦ * - компилятор применяет этот метод оптимизации. ¦
+-------------------------------------------------------------+
¦ Большинство включенных в обзор компиляторов языка Си ¦
¦ поддерживают простые методы оптимизации, такие как ¦
¦ алгебраические упрощения, и только несколько компиляторов ¦
¦ применяют более сложные формы, такие как удаление общих ¦
¦ подвыражений. ¦
L--------------------------------------------------------------
Выход компилятора Turbo C представляет собой разумный, но не очень оптимизированный код. Кроме свертки констант, удаления лишних загрузок регистров и алгебраических упрощений, компилятор выполняет только снижение мощности, удаление недостижимого кода и размещение переменных в регистрах. Он не поддерживает другие общие методы оптимизации, такие как удаление лишних сохранений, общих подвыражений и переменных индукции цикла, а также вынесение инвариантного кода.
Turbo C разумно управляет прологом и эпилогом функций и использованием регистров, засылая в стек и извлекая только те регистры, которые явно используются внутри тела функции.
Компилятор C86Plus вырабатывает хороший код со средним уровнем оптимизации. Он выполняет базовые приемы оптимизации, такие как свертка констант и размножение копий. Однако он не выполняет размножение констант для удаления лишних сохранений.
Хотя компилятор успешно выполняет алгебраические упрощения, он порождает лишние инструкции из-за того, что размещает результаты в регистрах, вместо того, чтобы помещать их в переменные. Этот эффект проявляется в том, что при размещении переменных в регистрах предпринимаются попытки переразмещения, так как при выполнении нескольких операторов результаты в действительности должны быть присвоены соответствующим переменным.
Хотя C86Plus успешно справляется со сверткой явных дублирующихся присваиваний в одно присваивание, удаление лишних сохранений он выполняет неустойчиво. Единственное лишнее присваивание в функции dead_code остается единственной командой после того, как компилятор удаляет недостижимый код из функции.
C86Plus - один из нескольких компиляторов рассматриваемого набора, который преобразует инициализацию элементов массива из функции проверки разворачивания циклов в эквивалентную команду STOSW процессора 80x86 с префиксом REP. Однако, что касается разумного уровня оптимизации в других областях, то он не смог решить задачу преобразования цепочки переходов в функции jump_chain_compression в один переход. Он не выполняет существенную оптимизацию циклов.
С появлением 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 каждый передаваемый параметр был помещен в регистр. Внутри тела функции не было ссылок в память, кроме начальной засылки в регистры.
Читать дальше