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



> {

> 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 */