Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНА РОБОТА № 4.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
358.91 Кб
Скачать

Оптимізація об'єктного коду методом виключення зайвих операцій

Определим понятие лишней операции. Операция линейного участка с порядковым номером i считается лишней, если существует более ранняя идентичная ей операция с порядковым номером j и никакая переменная, от которой зависит эта операция, не изменялась никакой третьей операций, имеющей порядковый номер между i и j.

Алгоритм исключения лишних операций просматривает операции в порядке их следования. Также как и алгоритму свертки, алгоритму исключения лишних операций проще всего работать с триадами, потому что они полностью отражают взаимосвязь операций.

Щоб стежити за внутрішньою залежністю змінних і тріад алгоритм привласнює їм деякі значення, звані числами залежності, по наступних правилах:

  • спочатку для кожної змінної її число залежності рівне 0, оскільки на початку роботи програми значення змінної не залежить ні від якої тріади;

  • після обробки i-ой тріади, в якій змінній A привласнюється деяке значення, число залежності A (dep(A)) отримує значення i, оскільки значення A тепер залежить від даної i-ой тріади;

  • при обробці i-ой тріади її число залежності (dep(i)) приймається рівним значенню: 1+(максимальне з чисел залежності операндів).

Таким чином, при використанні чисел залежності тріад і змінних можна стверджувати, що якщо i-ая тріада ідентична j-ой тріаді (j<i), то i-ая тріада вважається зайвою в тому і лише у тому випадку, коли dep(i)=dep(j).

Алгоритм виключення зайвих операцій використовує в своїй роботі також особливого вигляду тріади SAME(j,0), які означають, що деяка тріада i ідентична тріаді j.

Алгоритм виключення зайвих операцій послідовно проглядає тріади лінійної ділянки. Він складається з наступних кроків, що виконуються для кожної тріади:

Якщо операнд посилається на особливу тріаду виду SAME(j,0), то він замінюється на посилання на тріаду з номером j (^j).

2. Обчислюється число залежності поточної тріади з номером i, виходячи з чисел залежності її операндів.

3. Якщо існує ідентична j-ая тріада, причому j<i і dep(i)=dep(j), то поточна тріада i замінюється на тріаду особливого виду SAME(j,0).

4. Якщо поточна тріада є привласнення, то обчислюється число залежності відповідної змінної.

Розглянемо роботу алгоритму на прикладі:

D := D + C*B;

A := D + C*B;

C := D + C*B;

Цьому фрагменту програми відповідатиме наступна послідовність тріад:

  1. * (C, B)

  2. + (D, ^1)

  3. := (D, ^2)

  4. * (C, B)

  5. + (D, ^4)

  6. := (A, ^5)

  7. * (C, B)

  8. + (D, ^7)

  9. := (C, ^8)

Роботу алгоритму відобразимо в табл. 8.

Тепер, якщо виключити тріади особливого виду SAME(j,0), то в результаті виконання алгоритму отримаємо наступну послідовність тріад:

  1. * (C, B)

  2. + (D, ^1)

  3. := (D, ^2)

  4. + (D, ^1)

  5. := (A, ^4)

  6. := (C, ^4)

Зверніть увагу, що в підсумковій послідовності змінилася нумерація тріад і номера в посиланнях одних тріад на інших. Якщо в програмі компілятора як посилання використовувати не номери тріад, а безпосередньо покажчики на них, то зміну посилань в такому варіанті не буде потрібно.

Таблиця 8.

Приклад роботи алгоритму виключення зайвих операцій.

Оброблювана

Числа залежності змінних

Числа залежності тріад

Тріади, отримані після виконання

тріада i

A

B

C

D

dep(i)

алгоритму

1) * (C, B)

0

0

0

0

1

1) * (C, B)

2) + (D, ^1)

0

0

0

0

2

2) + (D, ^1)

3) := (D, ^2)

0

0

0

3

3

3) := (D, ^2)

4) * (C, B)

0

0

0

3

1

4) SAME (1, 0)

5) + (D, ^4)

0

0

0

3

4

5) + (D, ^1)

6) := (A, ^5)

6

0

0

3

5

6) := (A, ^5)

7) * (C, B)

6

0

0

3

1

7) SAME (1, 0)

8) + (D, ^7)

6

0

0

3

4

8) SAME (5, 0)

9) := (C, ^8)

6

0

9

3

5

9) := (C, ^5)