martwa linia

Transkrypt

martwa linia
Generacja kodu docelowego
● Zagadnienia związane z generacją kodu
● Język wejściowy i wynikowy
● Zarządzanie pamięcią (adresacja)
● Wybór rozkazów maszynowych (koszty rozkazów)
● Przydział i wyznaczanie rejestrów
● Kolejność obliczeń
● Bloki bazowe
● lider ­ pierwsza instrukcja, instrukcja bezpośrednio po skoku, cel skoku
● przekształcenia bloków bazowych
● zachowujące strukturę: ● usuwanie wspólnych podwyrażeń (common subexpression), ● usuwanie martwego kodu, ● zamiana nazw zmiennych tymczasowych, ● wymiana dwu niezależnych instrukcji sąsiednich
● algebraiczne
O.Świda wg A.Aho,R.Sethi,J.Ullman
1
(1) r := 0
(2) i := 1
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
t1 := 4 * i
t2 := a [ t1 ]
t3 := 4 * i
t4 := b [ t3 ]
t5 := t2 * t4
t6 := r + t5
r := t6
t7 := i + 1
i := t7
if i <= 5 goto (3)
(1)
(2)
i := 0
j := 0
Bloki
bazowe
i grafy
przepływu
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
t1 := i * j
t2 := t1 * j
t3 := a [ t2 ]
t4 := j * j
t5 := t4 + i
t6 := b [ t5 ]
t7 := i * j
t8 := t7 + j
t9 := t3 * t6
t10 := c [ t8 ]
t11 := t10 + t9
c[t8] := t11
t12 := j + 1
j := t12
if j < 5 goto (3)
(18) t13 := i + 1
(19) i := t13
(20) if i < 5 goto (2)
O.Świda wg A.Aho,R.Sethi,J.Ullman
2
Bloki bazowe c.d
Określanie ostatniego użycia zmiennej
● każda zmienna opisywana jest przez parę [ status(żywa/martwa), linia ]
● przeglądamy instrukcje od końca (zmienne nietymczasowe są żywe przy wyjściu z bloku)
● w każdej linii i postaci x := y op z zapisujemy aktualny status oraz zapisujemy: x[martwa,­], y[żywa,i], z[żywa,i] w tablicy symboli ● Zmienne tymczasowe a informacja o używaniu zmiennych
● Directed Acyclic Graph ­ reprezentacja bloku
● Liście etykietowane nazwami zmiennych lub stałych (z indeksem 0)
● Wierzchołki wewnętrzne posiadają: etykietę operatora, sekwencję identyfikatorów (aktualne wartości nazw)
● Przydatne do usuwania wspólnych podwyrażeń
●
O.Świda wg A.Aho,R.Sethi,J.Ullman
3
Przykładowy kod
Rejestry (R0,R1) , pamięć dla zmiennych, ● Instrukcje: MOV, ADD,SUB,MULT (źródło, cel)
●
t1 := a + b
t2 := c + d
t3 := e ­ t2
t4 := t1 ­ t3
Zmiana kolejności instrukcji
może polepszyć kod wynikowy
O.Świda wg A.Aho,R.Sethi,J.Ullman
MOV ADD MOV ADD MOV MOV SUB MOV SUB MOV a, R0
b, R0
c, R1
d, R1
R0, t1
e, R0
R1,R0
t1,R1
R0,R1
R1,t4
4
Directed Acyclic Graph
W(x) ­ wskaźnik na ostatnio utworzony wierzchołek związany z x
● Dla każdej instrukcji postaci: (1) x := y op z lub (2) x := op y lub (3) x:=y
● jeżeli W(y)== undef (podobnie dla z w przypadku (1) )
● W(y) = nowy wierzchołek o etykiecie y
● w sytuacji:
● (1) sprawdź, czy istnieje wierzchołek o etykiecie op ,którego lewym dzieckiem jest W(y), a prawym W(z).
W (2) podobnie. Jeżeli istnieje taki wierzchołek to oznacz go n , jeśli nie utwórz nowy. W przypadku (3) n=W(y)
● Usuń x z listy identyfikatorów wierzchołka W(x) i dodaj x do listy n.
● W(x) = n
●
O.Świda wg A.Aho,R.Sethi,J.Ullman
5
Heurystyczne porządkowanie DAG oraz etykietowanie
WW - zbiór niewypisanych wierzchołków wewnętrznych
dopóki WW nie jest pusty: {
n - niewypisany wierzchołek z wypisanymi rodzicami
wypisz n
dopóki skrajne lewe dziecko (m) dla n nie ma niewypisanych
rodziców i nie jest liściem: {
wypisz m
n := m
}
}
Jeżeli n jest liściem:
lewostronnym - etykieta = 1
innym - etykieta = 0
w przeciwnym wypadku:
n1,n2,n3...ni dzieci uporządkowane wg etykiet
etykieta = maxi (etykieta(ni)+i-1)
O.Świda wg A.Aho,R.Sethi,J.Ullman
6
Przykład generacji kodu
gen(n):
(0) if: n liść reprezentujący zmienną i lewostronne dziecko
"MOV n, top(rejestry)"
elseif: n wierzchołek wewnętrzny operatora OP (n1,n2 - dzieci)
(1) if: et(n2) == 0
gen(n1)
"OP n2, top(rejestry)"
(2) elseif: 1 <= et(n1) < et(n2) oraz et(n1) < rozmiar(rejestry)
swap(rejestry); gen(n2); R = pop(rejestry);
gen(n1); "OP R,top(rejestry)" ; push(rejestry,R)
swap(rejestry)
(3) elseif: 1 <= et(n2) <= et(n1) oraz et(n2) < rozmiar(rejestry)
gen(n1); R = pop(rejestry); gen(n2);
"OP top(rejestry), R"
push(rejestry,R)
(4) else:
gen(n2); T = pop(temp); "MOV top(rejestry), T";
gen(n1); push(temp,T); "OP T, top(rejestry)"
O.Świda wg A.Aho,R.Sethi,J.Ullman
7