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



> ivector5[ i * 2 + 3 ] = 5;

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

¦ Глубокие подвыражения ¦

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

> if( i < 10 )

> j5 = i5 + i2;

> 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()