Выбрать главу

 

j4 = 2;

if( i2 < j4 && i4 < j4 )

i2 = 2;

 

j4 = k5;

if( i2 < j4 && i4 < j4 )

i5 = 3;

 

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

¦ Свертка констант, арифметические тождества ¦

¦ и излишние операции загрузки/сохранения ¦

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

 

i3 = 1 + 2;

flt_1 = 2.4 + 6.3;

i2 = 5;

j2 = i + 0;

k2 = i / 1;

i4 = i * 1;

i5 = i * 0;

 

#ifndef NO_ZERO_DIVIDE

/*

* Некоторые компиляторы распознают ошибку

* деления на нуль и не генерируют объектный код

*/

i2 = i / 0;

flt_2 = flt_1 / 0.0;

#else

printf( "This compiler handles divide-by-zero as \

an error\n");

#endif

flt_3 = 2.4 / 1.0;

flt_4 = 1.0 + 0.0000001;

flt_5 = flt_6 * 0.0;

flt_6 = flt_2 * flt_3;

 

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

¦ Лишнее присваивание ¦

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

 

k3 = 1;

k3 = 1;

 

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

¦ Снижение мощности ¦

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

 

k2 = 4 * j5;

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

ivector4[ i ] = i * 2;

 

 

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

¦ Простой цикл ¦

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

 

j5 = 0;

k5 = 10000;

do {

k5 = k5 - 1;

j5 = j5 + 1;

i5 = (k5 * 3) / (j5 * constant5);

} while ( k5 > 0 );

 

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

¦ Управление переменной индукции цикла ¦

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

for( i = 0; i < 100; i++ )

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 ¦

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