- •Лабораторна робота № 4 Генерація і оптимізація об'єктнго кода
- •Короткі теоретичні відомості
- •Побудова асемблерного коду по дереву виводу
- •Побудова списку тріад по дереву виводу.
- •Оптимізація об'єктного коду методом виключення зайвих операцій
- •Загальний алгоритм генерації і оптимізації об'єктного коду
Оптимізація об'єктного коду методом виключення зайвих операцій
Определим понятие лишней операции. Операция линейного участка с порядковым номером 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;
Цьому фрагменту програми відповідатиме наступна послідовність тріад:
* (C, B)
+ (D, ^1)
:= (D, ^2)
* (C, B)
+ (D, ^4)
:= (A, ^5)
* (C, B)
+ (D, ^7)
:= (C, ^8)
Роботу алгоритму відобразимо в табл. 8.
Тепер, якщо виключити тріади особливого виду SAME(j,0), то в результаті виконання алгоритму отримаємо наступну послідовність тріад:
* (C, B)
+ (D, ^1)
:= (D, ^2)
+ (D, ^1)
:= (A, ^4)
:= (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) |