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



¦ ¦

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

>#include

>#include

>#define max_vector 2

>#define constant5 5

>typedef unsigned char uchar;

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

>int i2, j2, k2;

>int g3, h3, i3, k3, m3;

>int i4, j4;

>int i5, j5, k5;

>double flt_1, flt_2, flt_3, flt_4, flt_5, flt_6;

>int ivector[ 3 ];

>uchar ivector2[ 3 ];

>short ivector4[ 6 ];

>int ivector5[ 100 ];

>#ifndef NO_PROTOTYPES

>void dead_code( int, char * );

>void unnecessary_loop( void );

>void loop_jamming( int );

>void loop_unrolling( int );

>int jump_compression( int, int, int, int, int );

>#else

>void dead_code();

>void unnecessary_loop();

>void loop_jamming();

>void loop_unrolling();

>int jump_compression();

>#endif

>int main( argc, argv ) /* optbench */

> int argc;

> char **argv;

> {

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

¦ Размножение констант и копий ¦

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

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