Генерация высококачественного кода для программ, написанных на СИ - [15]

Шрифт
Интервал

> else

> k5 = i5 + i2;

>/* ------------------------------------------------ *

¦ Проверка того, как компилятор генерирует адрес ¦

¦ переменной с константным индексом, размножает ¦

¦ копии и регистры ¦

* ------------------------------------------------ */

> ivector[ 0 ] = 1; /* генерация константного адреса */

> ivector[ i2 ] = 2; /* значение i2 должно быть скопировано*/

> ivector[ i2 ] = 2; /* копирование регистров */

> ivector[ 2 ] = 3; /* генарация константного адреса */

>/* ----------------------------- *

¦ Удаление общих подвыражений ¦

* ----------------------------- */

> if(( h3 + k3 ) < 0 || ( h3 + k3 ) > 5 )

> printf("Common subexpression elimination\n>");

> else {

> m3 = ( h3 + k3 ) / i3;

> g3 = i3 + (h3 + k3);

>/* -------------------------------------- *

¦ Вынесение инвариантного кода ¦

¦ (j * k) может быть вынесено из цикла ¦

* -------------------------------------- */

> for( i4 = 0; i4 <= max_vector; i4++)

> ivector2[ i4 ] = j * k;

>/* ----------------------------- *

¦ Вызов функции с аргументами ¦

* ----------------------------- */

> dead_code( 1, "This line should not be printed" );

>/* ------------------------------ *

¦ Вызов функции без аргументов ¦

* ------------------------------ */

> unnecessary_loop();

> } /* Конец функции main */

/* ------------------------------------------------------ *

¦ Функция: dead_code ¦

¦ Проверка недостижимого кода и лишних ¦

¦ присваиваний. Не должен генерироваться код. ¦

* ------------------------------------------------------ */

>void dead_code( a, b )

> int a;

> char *b;

> {

> int idead_store;

> idead_store = a;

> if( 0 )

> printf( "%s\n>", b );

> } /* Конец dead_code */

/* ---------------------------------------------------- *

¦ Функция: unnecessary_loop ¦

¦ Цикл в следующей функции ненужен, так как ¦

¦ значение присваивания постоянно. В идеале ¦

¦ цикл должен быть удален. ¦

* ---------------------------------------------------- */

>void unnecessary_loop()

> {

> int x;

> x = 0;

> for( i = 0; i < 5; i++ ) /* Цикл не должен генерироваться*/

> k5 = x + j5;

> } /* Конец unnecessary_loop */

/* ---------------------------------------------------- *

¦ Функция: loop_jamming ¦

¦ Два цикла в этой функции имеют одинаковые ¦

¦ заголовки и могут быть слиты в один. ¦

* ---------------------------------------------------- */

>void loop_jamming( x )

> int x;

> {

> for( i = 0; i < 5; i++ )

> k5 = x + j5 * i;

> for( i = 0; i < 5; i++ )

> i5 = x * k5 * i;

> } /* Конец loop_jamming */

/* ------------------------------------------------------ *

¦ Функция: loop_unrolling ¦

¦ Цикл в этой функции должен быть заменен ¦

¦ тремя присваиваниями с использованием ¦

¦ константной индексации массива или машинно- ¦

¦ зависимыми командами для инициализации ¦

¦ блока памяти. ¦

* ------------------------------------------------------ */

>void loop_unrolling( x )

> int x;

> {

> for( i = 0; i < 6; i++ )

> ivector4[ i ] = 0;

> } /* Конец loop_unrolling */

/* ----------------------------------------------------- *

¦ Функция: jump_compression ¦

¦ Эта программа полезна для демонстрации ¦

¦ сжатия цепочки переходов. goto end_1 может ¦

¦ быть заменен на прямой переход на beg_1. ¦

* ----------------------------------------------------- */

>int jump_compression( i, j, k, l, m )

>int i, j, k, l, m;

> {

>beg_1:

> if( i < j )

> if( j < k )

> if( k < l )

> if( l < m )

> l += m;

> else

> goto end_1;

> else

> k += l;

> else {

> j += k;

>end_1:

> goto beg_1;

> }

> else

> i += j;

> return( i + j + k + l + m );

> } /* Конец jump_compression */



Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.