Fordítás Kódoptimalizálás

Hasonló dokumentumok
Fordítás Kódoptimalizálás

Vezérlésfolyam gráf és X86 utasításkészlet

Fordító Optimalizálás

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Algoritmizálás és adatmodellezés tanítása 1. előadás

Fordító Optimalizálás

Java programozási nyelv

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

A fordítóprogramok szerkezete. Kódoptimalizálás. A kódoptimalizálás célja. A szintézis menete valójában. Kódoptimalizálási lépések osztályozása

BASH script programozás II. Vezérlési szerkezetek

Apple Swift kurzus 3. gyakorlat

Programok értelmezése

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Kiterjesztések sek szemantikája

A programozás alapjai

Programozás alapjai. 5. előadás

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Objektumorientált Programozás III.

Algoritmizálás + kódolás C++ nyelven és Pascalban

Szoftvertervezés és -fejlesztés I.

A C programozási nyelv II. Utasítások. A függvény.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

6. fejezet: Ciklusok

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

Stack Vezérlés szerkezet Adat 2.

2. Visszalépéses keresés

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Internet programozása. 3. előadás

Komputeralgebra Rendszerek

Szoftver karbantartási lépések ellenőrzése

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Haladó DBMS ismeretek 1

A PROGRAMOZÁS ALAPJAI 3. Készítette: Vénné Meskó Katalin

C programozás. 1 óra Bevezetés

Programozási nyelvek JAVA EA+GY 1. gyakolat

Mintavételes szabályozás mikrovezérlő segítségével

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

2. Visszalépéses stratégia

Informatika terméktervezőknek

... S n. A párhuzamos programszerkezet két vagy több folyamatot tartalmaz, melyek egymással közös változó segítségével kommunikálnak.

Bonyolultságelmélet. Monday 26 th September, 2016, 18:50

Java II. I A Java programozási nyelv alapelemei

Erdélyi Magyar TudományEgyetem (EMTE

LabView Academy. 4. óra párhuzamos programozás

Alap fatranszformátorok II

Java II. I A Java programozási nyelv alapelemei

Neumann János Tehetséggondozó Program Gráfalgoritmusok II.

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Bevezetés az informatikába

Dr. Schuster György február / 32

Szoftvertechnológia alapjai Java előadások

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Korlátos modellellenőrzés. dr. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Python bevezető foglalkozás Python bevezető foglalkozás

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Algoritmuselmélet. Mélységi keresés és alkalmazásai. Katona Gyula Y.

Programozási nyelvek Python

Delphi programozás IV.

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Fordítóprogramok felépítése, az egyes programok feladata. A következő jelölésmódot használjuk: program(bemenet)(kimenet)

C programozási nyelv

ABB Teach Pendant programozás segédlet

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Intelligens Rendszerek Elmélete IRE 4/32/1

Occam 1. Készítette: Szabó Éva

Ismerkedés a Python programnyelvvel. és annak micropython változatával

Tuesday, March 6, 12. Hasító táblázatok

Labor gyakorlat Mikrovezérlők

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Szkriptnyelvek. 1. UNIX shell

Máté: Assembly programozás

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Felhasználó által definiált adattípus

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Operációs Rendszerek II. labor. 2. alkalom

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

A C# programozási nyelv alapjai

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Adatszerkezetek és algoritmusok

Irányítástechnika Elıadás. PLC-k programozása

Adminisztrációs feladatok Strukturált programok A C programnyelv elemei

2018, Diszkrét matematika

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

AWK programozás, minták, vezérlési szerkezetek

Programozási nyelvek a közoktatásban alapfogalmak I. előadás

Teszttervezés. Majzik István, Micskei Zoltán. Integrációs és ellenőrzési technikák (VIMIA04) Méréstechnika és Információs Rendszerek Tanszék

Labor gyakorlat Mikrovezérlők

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

Táblázatok fontosabb műveletei 1

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Átírás:

Fordítás Kódoptimalizálás Kód visszafejtés. Izsó Tamás 2015. október 15. Izsó Tamás Fordítás Kódoptimalizálás / 1

Aktív változók Angol irodalomban a Live Variables kifejezést használják, míg az azt felhasználó elemzést Liveness Analysis-nek hívják. Az aktív változók ismeretében lehet a felesleges utasításokat megszüntetni. Egy változó a program egy pontján aktív, ha később az értéke felhasználásra kerül. Izsó Tamás Fordítás Kódoptimalizálás / 2

Aktív változók előállítása A feldolgozás az alapblokk végétől az eleje felé halad. A blokk végén lévő aktív változók halmazát az algoritmus alapján mi határozzuk meg. Amikor az a = b + c 1 kifejezéshez érünk: az a változót ki kell venni; a b és c változókat be kell tenni az az aktív változók halmazába. 1 Összeadás helyett tetszőleges egy és kétoperandusú kifejezés is szerepelhet. Izsó Tamás Fordítás Kódoptimalizálás / 3

Aktív változó v=x+y; c=v+5; v=z+w Izsó Tamás Fordítás Kódoptimalizálás / 4

Aktív változó v=x+y; v változó definiálása c=v+5; v=z+w Izsó Tamás Fordítás Kódoptimalizálás / 4

Aktív változó v=x+y; v változó definiálása v változó használata c=v+5; v=z+w Izsó Tamás Fordítás Kódoptimalizálás / 4

Aktív változó v=x+y; v változó definiálása v változó használata v változó újradefiniálása c=v+5; v=z+w Izsó Tamás Fordítás Kódoptimalizálás / 4

Aktív változó v=x+y; v változó definiálása v változó használata v változó újradefiniálása v változó értéke felesleges c=v+5; v=z+w Izsó Tamás Fordítás Kódoptimalizálás / 4

Aktív változó globális analízise v változó aktív a p pontban start v változó nem aktív a p pontban start v változó aktív a p pontban start v=x+y; p v=x+y; p p a=v+5; v=x+5; v=v+5; end end end Izsó Tamás Fordítás Kódoptimalizálás / 5

Aktív változók előállítása a = b; c = a; d = a + b; e = d; d = a; f = e; Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; c = a; d = a + b; e = d; d = a; f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; c = a; d = a + b; e = d; d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; c = a; d = a + b; e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; c = a; d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Aktív változók előállítása { b } a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 6

Felesleges kód törlése { b } a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 7

Felesleges kód törlése { b } a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} f = e; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 7

Felesleges kód törlése { b } a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 7

Felesleges kód törlése { b } a = b; { a, b } c = a; { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 7

Felesleges kód törlése { b } a = b; { a, b } { a, b } d = a + b; { a, b, d } e = d; { a, b, e} d = a; { b, d, e} {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 7

Felesleges kód törlése a = b; d = a + b; e = d; d = a; Izsó Tamás Fordítás Kódoptimalizálás / 7

Aktív változók előállítása II a = b; d = a + b; e = d; d = a; Izsó Tamás Fordítás Kódoptimalizálás / 8

Aktív változók előállítása II a = b; d = a + b; e = d; d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 8

Aktív változók előállítása II a = b; d = a + b; e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 8

Aktív változók előállítása II a = b; d = a + b; {a, b, d } e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 8

Aktív változók előállítása II a = b; {a, b } d = a + b; {a, b, d } e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 8

Aktív változók előállítása II { b } a = b; {a, b } d = a + b; {a, b, d } e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 8

Felesleges kód törlése { b } a = b; {a, b } d = a + b; {a, b, d } e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 9

Felesleges kód törlése { b } a = b; {a, b } d = a + b; {a, b, d } e = d; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 9

Felesleges kód törlése { b } a = b; {a, b } d = a + b; {a, b, d } {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 9

Felesleges kód törlése a = b; d = a + b; d = a; Izsó Tamás Fordítás Kódoptimalizálás / 9

Aktív változók előállítása III a = b; d = a + b; d = a; Izsó Tamás Fordítás Kódoptimalizálás / 10

Aktív változók előállítása III a = b; d = a + b; d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 10

Aktív változók előállítása III a = b; d = a + b; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 10

Aktív változók előállítása III a = b; {a, b } d = a + b; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 10

Aktív változók előállítása III { b } a = b; {a, b } d = a + b; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 10

Felesleges kód törlése { b } a = b; {a, b } d = a + b; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 11

Felesleges kód törlése { b } a = b; {a, b } d = a + b; {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 11

Felesleges kód törlése { b } a = b; {a, b } {a, b } d = a; {b, d } Izsó Tamás Fordítás Kódoptimalizálás / 11

Felesleges kód törlése a = b; d = a; Izsó Tamás Fordítás Kódoptimalizálás / 11

Aktív változók előállításának a formalizálása In n = n Kill n ) Gen n (Out { Out n = BI n az utolsó blokk végén. x succ(n) In x máskülönben. A kimenet van összehuzalozva az n után következő bemenetek uniójával. -ból következik, hogy az inicializálás az üres halmazzal történik, kivéve a kezdő állapotot. Out n alapján számítjuk az In n -t, tehát a számítás visszafele halad. Izsó Tamás Fordítás Kódoptimalizálás / 12

Reaching Definition analízis Az analízis megadja, hogy a program egy adott pontján az x változó hol kapott értéket. Elágazások és ciklusok miatt több ponton is definiálva 2 lehet. RD entry (p) = { RDinit kezdetben. p pred(p) RD exit(p ) máskülönben. RD exit (p) = (RD entry (p)\kill RD (p)) Gen RD (p) 2 Itt a definíciót bővebb értelemben használjuk. Minden pont, ahol egy változó értéket kap definíciós pontnak hívjuk. Izsó Tamás Fordítás Kódoptimalizálás / 13

Reaching Definition jelölések Ha az x változót a p pontban definiálva van, akkor ezt a tényt a (x, p) párral fejezzük ki. Az RD entry (p) és az RD exit (p) ezeknek a pároknak a halmazát tartalmazza. Inicializálás RD init = {(x,?) x programváltozó.} A kérdőjel azt jelenti, hogy még nem lett inicializálva a változó. Izsó Tamás Fordítás Kódoptimalizálás / 14

Példa Reaching Definition-ra [m := 2] 1 ; while [ n > 1] 2 do [m := m n ] 3 ; [ n := n 1] 4 end while [ stop ] 5 RD entry (1) = {(m,?), (n,?)} RD exit (1) = {(m, 1), (n,?)} RD entry (2) = RD exit (1) RD exit (4) Izsó Tamás Fordítás Kódoptimalizálás / 15

RD végeredmény RD entry RD exit 1 {(m,?),(n,?)} {(m,1),(n,?)} 2 {(m,1),(m,3),(n,?),(n,4)} {(m,1),(m,3),(n,?),(n,4)} 3 {(m,1),(m,3),(n,?),(n,4)} {(m,3),(n,?),(n,4)} 4 {(m,3),(n,?),(n,4)} {(m,3),(n,4)} 5 {(m,1),(m,3),(n,?),(n,4)} {(m,1),(m,3),(n,?),(n,4)} Izsó Tamás Fordítás Kódoptimalizálás / 16

Konstans kiértékelés fordítási időben I RD [x := a] l [x := a[y n]] l y FV (a) (y,?) / RD entry (l) ha (y, l ) RD entry (l) y = y [...] l = [y := n] l RD [x := a] l [x := n] l { FV (a) = a nem konstans ha a kifejezés értéke n Izsó Tamás Fordítás Kódoptimalizálás / 17

Konstans kiértékelés fordítási időben II RD S 1 S 1 RD S 1 ; S 2 S 1 ; S 2 RD S 2 S 2 RD S 1 ; S 2 S 1 ; S 2 RD S 1 S 1 RD if[b l ] then S 1 else S 2 if[b l ] then S 1 else S 2 RD S 2 S 2 RD if[b l ] then S 1 else S 2 if[b l ] then S 1 else S 2 RD S S RD while[b l ] do S while[b l ] do S Izsó Tamás Fordítás Kódoptimalizálás / 18

Konstans kiértékelés példa I. Program: [ x :=10] 1 ; [ y := x +10] 2 ; [ z := y +10] 3 ; RD analízis eredménye: RD entry (1) = {(x,?), (y,?), (z,?)} RD exit (1) = {(x, 1), (y,?), (z,?)} RD entry (2) = {(x, 1), (y,?), (z,?)} RD exit (2) = {(x, 1), (y, 2), (z,?)} RD entry (3) = {(x, 1), (y, 2), (z,?)} RD exit (2) = {(x, 1), (y, 2), (z, 3)} Izsó Tamás Fordítás Kódoptimalizálás / 19

Konstans kiértékelés példa II. RD [x := 10] 1 ; [y := x + 10] 2 ; [z := y + 10] 3 ; [x := 10] 1 ; [y := 10 + 10] 2 ; [z := y + 10] 3 ; [x := 10] 1 ; [y := 20] 2 ; [z := y + 10] 3 ; [x := 10] 1 ; [y := 20] 2 ; [z := 20 + 10] 3 ; [x := 10] 1 ; [y := 20] 2 ; [z := 30] 3 ; Izsó Tamás Fordítás Kódoptimalizálás / 20

Konstans kiértékelés példa II. Visual Studio C eredménye 1 int funcion() { 2 int x,y,z; 3 x=1; 4 y=100*x; 5 z=100*y-y; 6 while( x < 4 ) { 7 z = z +y; 8 y = 2*x; 9 x++; 10 } 11 return z; 12 } Lefordított kód: _funcion : 00000000: mov eax,2710h 00000005: r e t Izsó Tamás Fordítás Kódoptimalizálás / 21

Section 1 Vezérlésfolyam analízis Izsó Tamás Fordítás Kódoptimalizálás / 22

Domináns alapblokk A B i alapblokk akkor domináns B j felett, ha az entry pontból a j-edik blokkig minden lehetséges úton eljutva érinteni kell a B i blokkot. Minden blokk domináns önmagával. (a dom b) (b dom c) (a dom c). Közvetlen, vagy szomszédos dominanciáról akkor beszélünk, ha a dom b és a b esetén nem létezik olyan c, hogy (a dom c) (c dom b). Posztdominanciáról akkor beszélünk, ha a B j blokkból az exit, blokk fele haladva minden úton érintjük a B k blokkot. Izsó Tamás Fordítás Kódoptimalizálás / 23

Struktúrális analízis dominancia Entry Entry B1 fib(m) f0=0 B1 B2 f1=1 m<=1 B2 exit B3 return 1 f1=1 B3 B4 B4 m >= 1 B5 B6 B5 return f2 f2=f0+f1 f0=f1 exit B6 f1=f2 m=m-1 Izsó Tamás Fordítás Kódoptimalizálás / 24

Domináns alapblokk m n D(n) az n-re domináns alapblokkok halmaza Pred(n) az irányított vezérlési folyamatgráf alapján az n-be menő élek forrás csomópontjai D(n) = {n} p pred(n) D(p) Izsó Tamás Fordítás Kódoptimalizálás / 25

Dominancia meghatározása procedure Dom_Comp( N, Pred, r ) N : in set of Node; Pred : in Node set of Node; r : in Node; begin D, T : set of Node; n, p : Node; change:=true: boolean; Domin : Node set of Node; for each n N - {r} do Domin(n):=N; repeat change := false; for each n N - {r} do T:=N; for each p Pred(n) do T = Domin(p) ; od; D := { n } T; if D Domin(n) then change := true; Domin(n) := D; fi; od; until!change return Domin Izsó Tamás Fordítás Kódoptimalizálás / 26

Depth-First Search Mélységi keresés A A B F B F C G hátra C G keresztbe D H előre D H Jelölés: PRE: A POST: A E A B C D E E D C B A F G H H G F A A F D E E D F G H H G F A B C C B A E Izsó Tamás Fordítás Kódoptimalizálás / 27

DFS algoritmus N : in set of Node; r, x : Node i:=1, j:=1 : integer; Pre, Post : Node integer; Visit: Node boolean; Etype: (Node x Node ) enum{ tree, forward, back, cross }; procedure Deap_First_Search( N, Succ, x ) N : in set of Node; Succ : in Node set of Node; x : in Node; begin y : Node; Visit(x) := true; Pre(x) := j; j = j + 1; for each y Succ(x) do if!visit(y) then Deep_First_Search(N,Succ,y); EType(x y) := tree; elif Pre(x) < Pre(y) then EType(x y) := forward; elif Post(y) = 0 then EType(x y) := back; else EType(x y) := cross; fi; od; Post(x) := i; i :+= 1; end begin for each x N do; Visit(x) := false; Pre(x) := Post(x) := 0; od Deep_First_Search(N,Succ,r); end Izsó Tamás Fordítás Kódoptimalizálás / 28

Section 2 Kód struktúra visszafejtése Izsó Tamás Fordítás Kódoptimalizálás / 29

CFG struktúrájának az analízis célja felismerni a magasszintű vezérlési szerkezeteket if... then..., if... then... else..., switch... case... for, while, repeat; nem struktúrált részben lévő blokkok számának a minimalizálása. Izsó Tamás Fordítás Kódoptimalizálás / 30

Gráf alapfogalmak B A F G irányított gráf, N csomópontok halmaza, E élek halmaza; G = N, E ; N = {A, B, C, D, E, F, G, H} C D G H E N N = {A B, A F, B C, C B, C D, C E, D E, F D, F G, G H, G H} E Succ(b) = {n N e E hogy e = b n} Pred(b) = {n N e E hogy e = n b} Izsó Tamás Fordítás Kódoptimalizálás / 31

Aciklikus struktúrák B1 B4 B4 B2 B3 B2 B3 B2 B4 B5 if-the-else if-then B6 B7 B1 blokk B2 B3 B4 B5 B6 case-switch Izsó Tamás Fordítás Kódoptimalizálás / 32

Ciklikus struktúrák B1 B0 B2 self-loop while-loop B1 B1 B2 B2 B3 természetes loop (improper) nem struktúrált szerkezet Izsó Tamás Fordítás Kódoptimalizálás / 33

Struktúra meghatározása Globális adatok: Succ, Pred : Node set of Node; RegionType = enum { Block, IfThen, IfThenElse, Case, Proper, SelfLoop, WhileLoop, NaturalLoop, Improper } ; // Blokk hozzárendelése az őt tartalmazó összevont struktúrához StructOf: Node Node; // Összevont struktúra típusa (pl. if-then) StructType: Node RegionType; // Összevont struktúrák halmaza Structures: set of Node; // Összevont struktúra alá tartozó blokkok StructNodes : Node set of Node; // Összevont struktúra hierarchiája CTNodes: set of Node; CTEdges : set of Node x Node; PostCtr, PostMax:integer; Post: integer Node; Visit: Node boolean; Izsó Tamás Fordítás Kódoptimalizálás / 34

Ciklus keresés n vissza k m Izsó Tamás Fordítás Kódoptimalizálás / 35

Ciklus keresés n vissza n pont a ciklus kezdete; k m Izsó Tamás Fordítás Kódoptimalizálás / 35

Ciklus keresés n k vissza n pont a ciklus kezdete; k N pont, ahol Pred(n) = k; m Izsó Tamás Fordítás Kódoptimalizálás / 35

Ciklus keresés n k vissza m n pont a ciklus kezdete; k N pont, ahol Pred(n) = k; olyan m pont, hogy n-ből m-be és m-ből k-ba van út. Izsó Tamás Fordítás Kódoptimalizálás / 35

Strukturális analízis Procedure StructuralAnalysis(N, E, entry) N : in set of Node; E: in set of (Node x Node); entry: in Node; begin m, n, p : Node; rtype : RegionType; NodeSet, ReachUnder: set of Node; StuctOf := StructType := ; Stuctures := StructNodes := ; CTNodes := N; CTEdges := ; repeat Post := ; Visit := PostMax := 0; PostCtr := 1 DFS_Postorder(N, E, entry ); while N > 1 PostCtr PostMax do n := Post(PostCtr) ; rtype :=AcyclicRType(N,E,rtype,NodeSet); if rtype nil then p:= Reduce(N,E,rtype,NodeSet) ; if entry NodeSet then entry := p; fi; else ReachUnder := {n}; for each n N do // k amely vissza élen eljut n-be és, // m pont, amihez van n m, // és m k-ba él. if PathBack(m,n) then ReachUnder = {m}; fi; od; rtype :=CyclicRType(N,E,rtype, ReachUnder); if rtype nil then p:= Reduce(N,E,rtype,ReachUnder) ; if entry ReachUnder then entry := p; fi else PostCtr += 1; fi fi od; until N = 1; end Izsó Tamás Fordítás Kódoptimalizálás / 36

Blokkok DFS bejárása Procedure DFS_Postorder(N, E, x) N : in set of Node; E: in set of (Node x Node); x: in Node; begin y : Node; Visit(x):=true; for each y Succ(x) do if!visit(y) then DFS_Postorder(N,E,y); if; od; PostMax+= 1; Post(PostMax) := x; end Izsó Tamás Fordítás Kódoptimalizálás / 37

Aciklikus struktúrák feltérképezése Procedure AcyclicRType(N,E,node,nset) : RegionType N : in set of Node; E: in set of (Node x Node); node: inout Node; nset: out set of Node; begin m, n : Node; p, s: boolean; nset := ; n := node; p := true; s := Succ(n) = 1; while p s do nset = {n}; n := Succ(n); p := Pred(n) = 1; s := Succ(n) = 1; od; if p then nset = {n}; fi n := node; p := Pred(n) = 1; s:=true; while p s do nset = {n}; n := Pred(n); p := Pred(n) = 1; s := Succ(n) = 1; od if s then nset = {n}; fi node := n; if nset 2 then return Block; elif Succ(node) = 2 then m := Succ(node); n:= (Succ(node)-{m}); if Succ(m) = Succ(n) Succ(m) = 1 Succ(n) = 1 Pred(m) = 1 Pred(n) = 1 then nset := {node, m, n}; return IfThenElse; elif...... else return nil; fi; fi; end Izsó Tamás Fordítás Kódoptimalizálás / 38

Ciklikus struktúrák feltérképezése Procedure CyclicRType(N,E,node,nset) : RegionType N : in set of Node; E: in set of (Node x Node); node: in Node; nset: inout set of Node; begin m : Node; if nset = 1 then if node node E then return SelfLoop; else return nil; fi; fi; if m nset!path(node,m,n) then nset := MinimizeImproper(N,E,node,nset); return Improper; fi m := (nset - { node }); if Succ(node) = 2 Succ(m) = 1 Pred(node) = 2 Pred(m) = 1 then return WhileLoop; else return NaturalLoop; fi; end Izsó Tamás Fordítás Kódoptimalizálás / 39

Redukció Entry Entrya Entryb B1 B2 B2a Entryb B3 B3 B3 Entryc B4 B5 B4 B5a B4 B5b B3a B6 exit B7 B7 exit exit exit Izsó Tamás Fordítás Kódoptimalizálás / 40

Improper struktúrák kezelése Fubo Zhang és Erik H. D Hollander bebizonyították, hogy az általuk definiált három elemi programtranszformációs lépés Forward Copy, Backward Copy, Cut segítségével minden nem strukturált programrész strukturált formává alakítható. Módszerüket magasszintű blokk strukturált programozási nyelvre alkalmazták. Haicheng Wu és társai kisebb átalakításokkal a módszert assembly szintű programra is alkalmazhatóvá tették. Cikkek: Fubo Zhang and Erik H. D Hollander. Using hammock graphs to structure programs. IEEE Trans. Software Eng., 30(4):231-245, 2004. Haicheng Wu, Gregory Diamos, Jin Wang, Si Li, and Sudhakar Yalamanchili. Characterization and transformation of unstructured control flow in bulk synchronous gpu applications. Int. J. High Perform. Comput. Appl., 26(2):170-185, May 2012. Izsó Tamás Fordítás Kódoptimalizálás / 41

Forward Copy A következő ábrán a {B1, B2} és a {B3, B4} blokkok IfThen szerkezetet alkotnának, ha az E1 és E2 szaggatott élek nem szerepelnének. Forward Copy transzformáció: 1 Forward copy transzformáció során az IfThen szerkezetet alkotó {B1, B2} részgráf közös pontja B3 és az E2 él között található gráfot le kell másolni. 2 A (B2, B3) él végpontját a megismételt struktúra B 3 pontjára állítani. Az így kapott jobb oldali ábra {B3, B4} szerkezetére a forward copy transzformációt megismételve a gráf reducibilissé válik. Izsó Tamás Fordítás Kódoptimalizálás / 42

Forward Copy transzformáció Entry Entry B1 B1 B2 B2 B3 B3 B'3 B4 B4 B'4 B5 E1 E2 B5 E1 E2 B'5 E'1 Exit Exit Izsó Tamás Fordítás Kódoptimalizálás / 43

Backward Copy A következő ábrán található ciklus improper, mivel a belsejébe a B1 blokkokból az E1 élen keresztül be tudunk ugrani. Backward Copy transzformáció: 1 A ciklust alkotó blokkokat meg kell ismételni (backward copy). Ezzel megszüntethetjük a ciklus belsejébe történő ugrást. 2 A C1 élet a megismételt ciklusra kell állítani. A struktúra továbbra is irreducibilis maradt, mivel a {B1, B2, B3} IfThen szerkezetnek két kilépési pontja van, de ezt már az előbb ismertetett forward copy transzformációval megszüntethetjük. Izsó Tamás Fordítás Kódoptimalizálás / 44

Backward Copy transzformáció Entry Entry B1 B1 B2 B2 B'2 B3 E1 B3 E1 B'3 C1 B4 B4 B'4 C'1 B5 B5 C1 B'5 Exit Exit Izsó Tamás Fordítás Kódoptimalizálás / 45

Cut A következő ábrán a ciklus belsejéből az E1 és az E2 éleken keresztül is kiléphetünk, tehát ciklust több kilépési ponttal is rendelkezik. 1 Ciklus végét és a kilépés okát tartalmazó változók bevezetése. 2 "compare cycle" blokk bevezetése. A ciklus szervezését erre kell építeni. 3 "compare from" blokk bevezetése. Kilépés okának megfelelő folytatás elkészítése. Izsó Tamás Fordítás Kódoptimalizálás / 46

Cut transzformáció Entry Entry B1 B1 B2 B2 B3 cycle==true B3 E1 cycle==true B5 E1 B4 B5 B4 cycle:=true from:=b5 cycle:=false from:=b5 cycle:=false from:=b4 cycle==false B6 E2 cycle==false compare cycle Exit from==b4 compare from from==b5 B6 Exit Izsó Tamás Fordítás Kódoptimalizálás / 47

Gondolatok a strukturált programozásról improper keresztél irreducibilis nem struktúrált Dahl Dijkstra Hoare, Strukturált programozás 7. fejezet, A programok megértéséről www.hit.bme.hu/~izso/struct_prog.pdf Donald E. Knuth, Stuctured Programming with goto Statesments Linux: Using goto In Kernel Code C-ben a break, continue valóban megsérti a strukturált programozás elvét, avagy irreducibilis lesz a CFG (vezérlésfolyan gráf)? Izsó Tamás Fordítás Kódoptimalizálás / 48

Regiszter hozzárendelés Intel x86 processzor utasításkészlete kevés regisztert tartalmaz; néhány regiszter használata korlátozott; a gyors futás érdekében az adatokat érdemes a regiszterben tartani; ha nincs elég regiszter, ki kell menteni a memóriába; minimalizálni kell az egyidejűleg használt regiszterek számát; általában színezési problémára vezethető vissza. Izsó Tamás Fordítás Kódoptimalizálás / 49

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s1 s3 s6 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s2 s4 s5 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s1 s3 s6 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s2 s4 s5 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s1 s3 s6 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s2 s4 s5 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Regiszter hozzárendelés s1 s2 s3 s4 s5 s6 s1 = 2 s2 = 4 s1 s3 s6 s3 = s1 + s2 s4 = s3 + 1 s5 = s1 * s2 s2 s4 s5 s6 = s4 * s5 Izsó Tamás Fordítás Kódoptimalizálás / 50

Egyéb optimalizálási eljárások aritmetikai egyszerűsítés: x = 4 * a; x = a «2; konstans kifejezés kiértékelése: 4 * 1024 4096 Izsó Tamás Fordítás Kódoptimalizálás / 51

Optimalizált kód visszafejthetősége megjegyzések elvesznek; szimbólikus nevek elvesznek; adattípusok elvesznek; ciklus átrendezés, és kifejtés (unrolling); különböző lokális változók azonos regiszterekben cserélik egymást ; algebrai átírás; kódmozgás; Izsó Tamás Fordítás Kódoptimalizálás / 52