Генерация высококачественного кода для программ, написанных на СИ | страница 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()