Чтение онлайн

ЖАНРЫ

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

Хислей Филипп Н.

Шрифт:

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

 

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

{

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;

Поделиться с друзьями: