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