Fordító Optimalizálás

Hasonló dokumentumok
Fordító Optimalizálás

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

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Java II. I A Java programozási nyelv alapelemei

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

Java II. I A Java programozási nyelv alapelemei

Programok értelmezése

Fordítóprogramok. Aszalós László szeptember 7.

Java programozási nyelv

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Kifejezések. Kozsik Tamás. December 11, 2016

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

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

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...

Pénzügyi algoritmusok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

A C# programozási nyelv alapjai

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

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

A C programozási nyelv I. Bevezetés

Programozási nyelvek (ADA)

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Készítette: Nagy Tibor István

1. Jelölje meg az összes igaz állítást a következők közül!

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

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

A C programozási nyelv I. Bevezetés

Kifejezések. Kozsik Tamás. December 11, 2016

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Informatika terméktervezőknek

Szemantikai elemzés. konzisztenciájának vizsgálata a szemantikai elemzés feladata lesz.

OOP #14 (referencia-elv)

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

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

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

Programozás C és C++ -ban

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

A programozás alapjai

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

Programozás II. 2. Dr. Iványi Péter

A szemantikus elemzés elmélete. Szemantikus elemzés (attribútum fordítási grammatikák) A szemantikus elemzés elmélete. A szemantikus elemzés elmélete

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozási nyelvek Java

Szoftvertervezés és -fejlesztés I.

Apple Swift kurzus 3. gyakorlat

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

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

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

C programozási nyelv

Rekurzió. Dr. Iványi Péter

Objektumorientált Programozás VI.

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

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

és az instanceof operátor

Szoftverminőségbiztosítás

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

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

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

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

C programozás. 1 óra Bevezetés

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

A JavaScript főbb tulajdonságai

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

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

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

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

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

Kiterjesztések sek szemantikája

A C programozási nyelv IV. Deklaráció és definíció

C++ programozási nyelv Konstruktorok-destruktorok

Eljárások és függvények

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

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

Mindenki abból a három tantárgyból tesz szigorlatot, amelyet hallgatott.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

3. Osztályok II. Programozás II

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

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)

Haladó Fordítóprogramok

Már megismert fogalmak áttekintése

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

Stack Vezérlés szerkezet Adat 2.

Modellező eszközök, kódgenerálás

Pénzügyi algoritmusok

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Programozás I. 1. előadás: Algoritmusok alapjai. Sergyán Szabolcs

Készítette: Nagy Tibor István

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

Bisonc++ tutorial. Dévai Gergely. A szabály bal- és jobboldalát : választja el egymástól. A szabályalternatívák sorozatát ; zárja le.

Programozás II. 4. Dr. Iványi Péter

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

Bevezetés a programozásba. 9. Előadás: Rekordok

Osztályok. 4. gyakorlat

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Átírás:

Fordító Optimalizálás Kód visszafejtés. Izsó Tamás 2013. október 9. Izsó Tamás Fordítás Optimalizálás / 1

Section 1 Fordító részei Izsó Tamás Fordítás Optimalizálás / 2

Irodalom Fordító részei Optimalizálás Izsó Tamás Fordítás Optimalizálás / 3

Fordító részei Optimalizálás Irodalom Izsó Tamás Fordítás Optimalizálás / 4

Irodalom Fordító részei Optimalizálás 01-fm-i-viii-9780120884780 2011/1/13 15:54 page ii #2 Izsó Tamás Fordítás Optimalizálás / 5

Miért kell ismerni a fordítót? általában a fordító által generált kódot kell visszafejteni; ha ismerjük a fordító által alkalmazott kódtranszformációt, hamarabb rájöhetünk az eredeti tartalomra; tesztelni kell a fordítót; mert a fordító is azokat az algoritmusokat használja a kód elemzéshez, melyeket a modern decompiler-ek. (Miért, amikor a fordító rendelkezésére áll az eredeti forrás?) Izsó Tamás Fordítás Optimalizálás / 6

Fordító részei karakter sorozat Lexikai elemző tokenek sorozata Szintaktikai analízis absztrakt szintaktikai fa Szemantikai ellenőrzés Közbenső kódgenerálás szimbólumtábla absztrakt szintaktikai fa közbenső ábrázolás Gépfüggetlen kódoptimalizáló közbenső ábrázolás hiba logolás Kódgenerátor processzor függő kód Gépi kód függő optimalizálás processzor függő kód Izsó Tamás Fordítás Optimalizálás / 7

Lexikai elemző Fordító részei Optimalizálás 1 double calc( double initial, double rate ) 2 { 3 double position; 4 position = initial+rate*100; 5 return position; 6 } Izsó Tamás Fordítás Optimalizálás / 8

Lexikai elemző double calc( double initial, double rate ) \n { \n double position; \n position = initial+ rate*100; \n return position; \n } \n DOUBLE ID calc "(" DOUBLE ID initial "," DOUBLE ID rate ")" "{" DOUBLE ID position ";" ID position "=" ID position "+" ID rate "*" NUMBER 100 ";" "RETURN" ID position ";" Izsó Tamás Fordítás Optimalizálás / 9

Token token szintaktikai kategória, csoport; élő nyelvben: ige, főnév, melléknév, tárgy; programozási nyelvekben: egész konstans, valós konstans, string, azonosító, operátor, kulcsszó, írásjelek; lexéma konkrét megvalósulása egy tokennek; attribútum tokenhez rendelt tulajdonság, érték elmaradhat (pl. T_FOR) típus egész konstans, valós konstans, sztring értéke; méret; élettartam; láthatóság stb. nem token: szóköz, megjegyzés Izsó Tamás Fordítás Optimalizálás / 10

Blokk struktúra Fordító részei Optimalizálás i n t main ( ) { i n t a=1; i n t b=1; { i n t a=3; p r i n t f ("%d %d \ n ", a, b ) ; } } { i n t b=4; p r i n t f ("%d %d \ n ", a, b ) ; } p r i n t f ("%d %d \ n ", a, b ) ; r e t u r n 0; Izsó Tamás Fordítás Optimalizálás / 11

Szimbólum tábla a tokenizálás során keletkezett azonosítókat, és az azokhoz kapcsolódó attribútumokat tárolja; megőrzi a blokkstruktúrát; OOP esetén a származtatást; gyorsan lehet benne keresni; sokszor a kulcsszavakat is tartalmazza (pl. for, while). Izsó Tamás Fordítás Optimalizálás / 12

Szintaktikia analízis lexikai elemzés után tokenek sorozatát kapjuk; cél a program szerkezetének az értelmezése a környezetfüggetlen nyelvtani szabályok (context-free grammar CFG) alapján (műveletek, precedencia); cél a hibák felderítése; absztrakt szintaxisfa (abstract syntax tree AST) elkészítése. Izsó Tamás Fordítás Optimalizálás / 13

Szintaktikia analízisre eredménye function ident calc paramlist body ident initial paramlist declist stmtlist ident rate end ident position end = stmtlist ident position + RETURN end ident initial * NUM 100 ident rate NUM 100 Izsó Tamás Fordítás Optimalizálás / 14

Szemantikai analízis célja Olyan hibák felderítése, amit a CFG-ben nehéz, vagy nem lehet megadni. További információk gyűjtése. 1 extern void f ( i n t n ) ; 2 double calc ( ) 3 { i n t p1, p2 ; 4 i n t i, j ; 5.... 6 p1 = p1 + i ; / OK / 7 p1 = p1 + p2 ; / Hiba / 8 i f ( f ( p1 ) ) / Hiba f ( ) void / 9 { 10 i = j [ 2 ] ; / Hiba / 11 i = j [ p1 ] ; / OK / 12 } 13 / Nincs visszatérési érték / 14 } Izsó Tamás Fordítás Optimalizálás / 15

Miért használunk közbenső kódot (Intermediate reprezentáció) Assembly IR előny alkalmas az optimalizálásra; hátrány gépfüggő; hátrány minden egyes processzorra újra kellene írni az optimalizálót. előny alkalmas az optimalizálásra; előny gépfüggetlen. Izsó Tamás Fordítás Optimalizálás / 16

IR fajtái Forrás program és a gépi kód közötti átmenet. Magas szintű eredeti program visszaállítható (kivétel megjegyzések, tagolások). Felhasználják szintaxis vezérelt editorokban, pretty printing funkciókban. (pl. AST). A parser a fordításnál ezt állítja elő; Alacsony szintű minden sora majdnem egy gépi utasításra fordítható; Közepes szintű bizonyos struktúrákat megöriznek a jobb optimalizálás érdeképen. Például a magasszintű vezérlési szerkezeteket vagy index operátorokat tartalmaznak. Reprezentáció: gráf alapú (AST, vezérlés-áram gráf, adatáram gráf) ; lineáris; vegyes. Izsó Tamás Fordítás Optimalizálás / 17

Intermediate Language (IL) IL a közbenső ábrázolás (IR) nyelvtani szabályait tartalmazza minden fordító saját IL-t használ, akár többet is; IL = magasszintű assembly nyelv felhasználható regiszterek száma nincs korlátozva; assembly nyelv szintű vezérlési szerkezetek gépi utasításokat használnak, de egyes utasítások lehetnek magasszintűek is pl. call több assembly utasításra fordul legtöbb IL utasítás egy gépi utasításra fordítható Izsó Tamás Fordítás Optimalizálás / 18

Lineáris Intermediate Language típusai egy operandusú (stack szervezésű gépek pl. JVM); két operandusú x x < op > y ; három operandusú z x < op > y ; push 2 push y mul push x sub egy operandusú x 2 y t1 = 2 t2 = y t1 = t1 t2 t3 = x t3 = t3 t1 két operandusú t1 = 2 t2 = y t3 = t1 t2 t4 = x t5 = t4 t1 három operandusú Izsó Tamás Fordítás Optimalizálás / 19

Adatfüggőségi gráf 1. loadai r 0, 0 r 1 2. add r 1, r 1 r 1 3. loadai r 0, 8 r 2 4. mult r 1, r 2 r 1 5. loadai r 0, 16 r 2 6. mult r 1, r 2 r 1 7. loadai r 0, 24 r 2 8. mult r 1, r 2 r 1 9. storeai r 1 r 0, 0 1 2 4 6 3 8 5 7 ILOC kód 9 Izsó Tamás Fordítás Optimalizálás / 20

Quadruples (négyes) Művelet Op1 Op2 Eredmény loadi 2 t 1 load y t 2 mult t 1 t 2 t 3 load x t 4 sub t 4 t 3 t 5 Izsó Tamás Fordítás Optimalizálás / 21

Triples (hármas) Fordító részei Optimalizálás A triples, indirekt triples ábrázolás csak ciklus és elágazásmentes, azaz alapblokkban alkalmazható. (Alapblokk definíciója később lesz.) Zárójelben írt érték az adott utasítás eredményére hivatkozik. (1) loadi 2 (2) load y (3) mult (1) (2) (4) load x (5) sub (4) (3) Hátránya, hogy a sorok átrendezése nehézkes. Izsó Tamás Fordítás Optimalizálás / 22

Indirekt triples Fordító részei Optimalizálás Zárójelbe írt érték az adott utasításhoz rendelt [j] indexen keresztül hivatkozik arra az utasításra, melynek az eredményét használja. Ha az utasítás sorrendje változik, akkor az index értéke is módosul. Index sorszám [1] (1) loadi 2 [2] (2) load y [3] (3) mult (1) (2) [4] (4) load x [5] (5) sub (4) (3) Izsó Tamás Fordítás Optimalizálás / 23

SSA static single assignment x... y... while ( x < k ) { x x + 1 ; y y + x ; } x 0... y 0... i f ( x 0 k ) goto next loop : x 1 φ(x 0, x 2 ) ; y 1 φ(y 0, y 2 ) ; x 2 x 1 + 1 ; y 2 y 1 + x 2 ; i f ( x 2 < k ) goto loop next :.... Izsó Tamás Fordítás Optimalizálás / 24

SSA static single assignment Fordítókkal foglalkozó tudomány a változó definiciós pontjának (def) azt a helyet nevezi, ahol a változó értéket kap. Egy változóhoz több helyen is rendelhetünk új értéket. A kifejezések jobb oldalán meghivatkozott változó a változó használatát (use) jelenti. SSA esetén a többször definiált változókat a definiálás helyén egy egyedi indexszel különböztetjük meg. A változók használatakor megmondjuk, hogy a használt (use) változó melyik utasításban kapott értéket, azaz hol definiáltuk. Ha a használt változó definiciós pontja nem egyértelmű, mert a program különböző ágán eljutva, több ágon is definiáltuk a változót, akkor ennek leírására egy φ függvényt használunk. 1 A φ függvény megadja, hogy a változó értéke mely pontokban kaphatott értéket. 2 A φ függvény a fordítónak szól, belőle kód nem keletkezik. 3 A φ függvény paramétere minimum kettő, maximum akármennyi, de csak indexben eltérő változó lehet. Izsó Tamás Fordítás Optimalizálás / 25

Példa 3 operandusú IL-re int a; int b; t0 = b + c; int c; a = t0 + d; int d; t1 = a * a; a = b + c + d; t2 = b * b; b = a * a + b * b b = t1 + t2; temporális változók: t0, t1, t2 Izsó Tamás Fordítás Optimalizálás / 26

3 operandusú Intermediate Language egy utasításnak maximum 3 operandusa lehet; összetett kifejezésnél temporális változókat kell bevezetni; van két operandusú utasítás, pl. t1 = 5; Izsó Tamás Fordítás Optimalizálás / 27

Intermediate Language utasításkészlete Értékadás: var = constant; var = string ; var1 = var2; var = label ; Izsó Tamás Fordítás Optimalizálás / 28

Intermediate Language utasításkészlete Aritmetikai operátorok: var1 = var2 op var3; var1 = constant op var2; var1 = var2 op constant; var = constant1 op constant2; operátorok +.../,%,,& stb; Izsó Tamás Fordítás Optimalizálás / 29

Intermediate Language utasításkészlete Logikai értékek 0 hamis; nem 0 igaz. Logikai műveletek: var3 = var2 == var1; var3 = var2 < var1; var3 = var2 var1; var3 = var2 && var1; a többi logikai kifejezést ezek segítségével kell előállítani. Izsó Tamás Fordítás Optimalizálás / 30

Intermediate Language Vezérlésátadó utasítások: névvel rendelkező cimke L1: Goto label; IfZ value Goto label; IfZ csak a Goto utasítással együtt fordulhat elő; Izsó Tamás Fordítás Optimalizálás / 31

Intermediate Language Függvényhívó utasítás: LCall L1 esetén a hívott függvény címe fordítási időben ismert. ACall t1 t1 függvény címe futáskor áll elő (pl. virtuális függvénytábla). LCall L1; t1 = LCall L1; ACall t1; t0 = ACall t1; Izsó Tamás Fordítás Optimalizálás / 32

Intermediate Language Függvény definiálás: BeginFunc n; Függvény törzsének a kezdete, ahol n a lokális adatok számára szükséges hely bájtokan. EndFunc függvény vége; Return t1 visszatérés visszaadott értékkel; Return visszatérés a függvényből. Izsó Tamás Fordítás Optimalizálás / 33

Intermediate Language Memória címzés: t1 = t2 t1 = (t2+offset) t1 = t2 (t1 + offset ) = t2 offset negatív vagy pozitív egész érték. Tömb: t1[t2] = t3 t3 = t1[t2] az index operátor a C-ben megismert módon működik. Izsó Tamás Fordítás Optimalizálás / 34

Példa 3 operandusú IL-re int x; int y; L0: t0 = x < y; t1 = x == y; while(x<=y) { t2 = t0 t1; x = x + 2; IfZ t2 Goto L1; } x = x + 2; Goto L0 L1: y = x; y = x; Izsó Tamás Fordítás Optimalizálás / 35

Section 2 Optimalizálás Izsó Tamás Fordítás Optimalizálás / 36

Miért van szükség optimalizálásra AST-ből IR-re való egyszerű áttérés redundanciát okoz; egyes részszámításokat fel lehet gyorsítani; közös részeket össze lehet vonni; felesleges részeket ki lehet hagyni mert a programozók lusták for ciklusba, vagy a feltétel részbe írnak a ciklus végrehajtása során nem változó kifejezéseket; Izsó Tamás Fordítás Optimalizálás / 37

A kód optimalizálása kihívást jelent Cél: az eredményeket helyességét ne befolyásolja ; a lehető leghatékonyabb IR-t állítsa elő; ne tartson sok ideig. Valóság: néha hibát okoz a kód futásánál; sokáig tart a kódgenerálás. Legtöbb optimalizálási algoritmus NP-teljes, ha egyáltalán létezik megoldás. Izsó Tamás Fordítás Optimalizálás / 38

A program szemamtikáját nem befolyásoló optimalizálás felesleges temporális változók megszüntetése; fordítási időben ismert konstans kifejezések kiszámítása; ciklusban lévő invariáns részek kiemelése; ellenpéldaként meg lehet említeni (szemantikát befolyásoló optimalizálás) a buborékos rendezés kicserélése gyorsrendezésre. Izsó Tamás Fordítás Optimalizálás / 39

Példa IR optimalizálására t0 = x + x; int x; t1 = y; int y; b1 = t0 < t1; bool b1; bool b2; t2 = x + x; bool b3; t3 = y; b2 = t2 == t3; b1 = x + x < y; b2 = x + x == y; t4 = x + x; b3 = x + x > y; t5 = y; b3 = t5 < t4; Izsó Tamás Fordítás Optimalizálás / 40

Példa IR optimalizálására t0 = x + x; int x; t1 = y; int y; b1 = t0 < t1; bool b1; bool b2; t2 = x + x; bool b3; t3 = y; b2 = t2 == t3; b1 = x + x < y; b2 = x + x == y; t4 = x + x; b3 = x + x > y; t5 = y; b3 = t5 < t4; Izsó Tamás Fordítás Optimalizálás / 41

Példa IR optimalizálására t0 = x + x; int x; t1 = y; int y; b1 = t0 < t1; bool b1; bool b2; t2 = x + x; bool b3; t3 = y; b2 = t2 == t3; b1 = x + x < y; b2 = x + x == y; t4 = x + x; b3 = x + x > y; t5 = y; b3 = t5 < t4; Izsó Tamás Fordítás Optimalizálás / 42

Példa IR optimalizálására t0 = x + x; int x; t1 = y; int y; b1 = t0 < t1; bool b1; bool b2; t2 = x + x; bool b3; t3 = y; b2 = t0 == t1; b1 = x + x < y; b2 = x + x == y; t4 = x + x; b3 = x + x > y; t5 = y; b3 = t1 < t0; Izsó Tamás Fordítás Optimalizálás / 43

Példa IR optimalizálására t0 = x + x; int x; t1 = y; int y; b1 = t0 < t1; bool b1; bool b2; bool b3; b2 = t0 == t1; b1 = x + x < y; b2 = x + x == y; b3 = x + x > y; b3 = t1 < t0; Izsó Tamás Fordítás Optimalizálás / 44

Lusta programozó munkájának az optimalizálása L0: while( x < y+ z ) { t0 = y + z; x = x - y; t1 = x < t0; } IfZ t1 Goto L1 x = x - y; Goto L0; L1: Izsó Tamás Fordítás Optimalizálás / 45

Lusta programozó munkájának az optimalizálása L0: while( x < y+ z ) { t0 = y + z; x = x - y; t1 = x < t0; } IfZ t1 Goto L1 x = x - y; Goto L0; L1: Izsó Tamás Fordítás Optimalizálás / 46

Lusta programozó munkájának az optimalizálása t0 = y + z; while( x < y+ z ) { L0: x = x - y; t1 = x < t0; } IfZ t1 Goto L1 x = x - y; Goto L0; L1: Izsó Tamás Fordítás Optimalizálás / 47

Lusta programozó munkájának az optimalizálása t0 = y + z; while( x < y+ z ) { L0: x = x - y; t1 = x < t0; } IfZ t1 Goto L1 x = x - y; Goto L0; L1: Izsó Tamás Fordítás Optimalizálás / 48

IR megjelenítése Fordító részei Optimalizálás BeginFunc 40; t0 = LCall ReadInteger ; a = t0 ; t1 = LCall ReadInteger ; b = t1 ; L0 : t2 = 0; t3 = b == t2 ; t4 = 0; t5 = t3 == t4 ; I f Z t5 Goto L1 ; c = a ; a = b ; t6 = c % a ; b = t6 ; Goto L0 ; L1 : PushParam a ; LCall P r i n t I n t ; PopParams 4; EndFunc ; Izsó Tamás Fordítás Optimalizálás / 49

IR megjelenítése Fordító részei Optimalizálás BeginFunc 40; t0 = LCall ReadInteger ; a = t0 ; t1 = LCall ReadInteger ; b = t1 ; L0 : t2 = 0; t3 = b == t2 ; t4 = 0; t5 = t3 == t4 ; I f Z t5 Goto L1 ; c = a ; a = b ; t6 = c % a ; b = t6 ; Goto L0 ; L1 : PushParam a ; LCall P r i n t I n t ; PopParams 4; EndFunc ; Izsó Tamás Fordítás Optimalizálás / 50

IR megjelenítése Fordító részei Optimalizálás t0 = LCall ReadInteger ; a = t0 ; t1 = LCall ReadInteger ; b = t1 ; L0 t2 = 0; t3 = b == t2 ; t4 = 0; t5 = t3 == t4 ; I f Z t5 Goto L1 ; L1 c = a ; a = b ; t6 = c % a ; b = t6 ; Goto L0 ; PushParam a ; LCall P r i n t I n t ; PopParams 4; Izsó Tamás Fordítás Optimalizálás / 51

Alapblokk (Basic Block) az IR utasításainak a lineáris sorozata; egy belépési ponttal rendelkezik; egy kilépési pontja van, és ez a sorozat végén található; olyan utasítások sorozata, amelyek a blokk végrehajtása során biztosan végrehajtódnak. Alapblokkok kezdete és vége : a program első utasítása az első blokk kezdete; minden olyan hely, amelyre távolról át lehet adni a vezérlést (Goto, LCall, ACall ) egy új blokk kezdetét jelenti; ugró utasítás csak a blokk végén lehet; minden blokk vége után egy új blokk kezdődik (kivéve az utolsót). Izsó Tamás Fordítás Optimalizálás / 52

Vezérlési folyamatgráf Control Flow Gráf (CFG) irányított gráf csomópontjai az alapblokkok halmaza; az élek a blokkok végpontjából egy másik blokk belépési pontjára mutatnak; egy csomópontból több él léphet ki; egy csomópontba több alapblokkból is el lehet jutni. Izsó Tamás Fordítás Optimalizálás / 53

Optimalizálás fajtái lokális egy blokkon belül; globális teljes vezérlési folyamatgráfra. Izsó Tamás Fordítás Optimalizálás / 54

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = t1; t0 = 137; y = t0; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = t1; t0 = 137; y = t0; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = t1; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = t1; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = t2; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = y; Izsó Tamás Fordítás Optimalizálás / 55

Lokális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = y; Izsó Tamás Fordítás Optimalizálás / 55

Globális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = y; Izsó Tamás Fordítás Optimalizálás / 56

Globális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = y; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = y; Izsó Tamás Fordítás Optimalizálás / 56

Globális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = 137; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = 137; Izsó Tamás Fordítás Optimalizálás / 56

Globális optimalizálás i n t f ( i n t x ) { i n t y ; i n t z ; y = 137; i f ( x == 0) z = y ; else x = y ; } t1 = y; z = 137; t0 = 137; y = 137; IfZ x Goto L0; end t2 = y; x = 137; Izsó Tamás Fordítás Optimalizálás / 56

Ismétlődő kifejezések kiszűrése int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = Call Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4 ; a = t3 ; t4 = a + b ; c = t4 ; t5 = a + b ; PushParam t5 ; PushParam x ; Call set ; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 57

Ismétlődő kifejezések kiszűrése int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = Call Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4 ; a = t3 ; t4 = a + b ; c = t4 ; t5 = a + b ; PushParam t5 ; PushParam x ; Call set ; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 57

Ismétlődő kifejezések kiszűrése int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = Call Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4 ; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4 ; PushParam t5 ; PushParam x ; Call set ; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 57

Ismétlődő kifejezések kiszűrése int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = Call Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4 ; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4 ; PushParam t5 ; PushParam x ; Call set ; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 57

Ismétlődő kifejezések kiszűrése Ha van két értékadás v1 = a op b v2 = a op b és az a és b operandusok értéke közben nem változik, akkor a következő transzformációt hajthatjuk végre v1 = a op b v2 = v1 Ezzel elhagyjuk az ismétlődő számításokat. lehetőséget teremtünk egy későbbi optimalizáláshoz. Izsó Tamás Fordítás Optimalizálás / 58

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam x ; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam x ; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = a + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = t3 + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = t3 + b ; c = t4 ; t5 = t4; PushParam t5 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = t3 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = t3 ; t4 = t3 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = c; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 59

Másolat továbbterjedés angol szakirodalomban a Copy Propagation kifejezés él; ha lehet, akkor máshol is az eredeti példányra szeretnénk hivatkozni; Ha van egy értékadás v1 = v2 és a továbbiakban a v1 és v2 operandusok értéke nem változik, akkor a következő transzformációt hajthatjuk végre lecseréljük: a = v1 a = v2 Ez a transzformáció később a segítségünkre lesz. Izsó Tamás Fordítás Optimalizálás / 60

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; x = t1 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t3 = 4; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; a = 4 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t4 = 4 + b ; c = t4 ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t4 = 4 + b ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t4 = 4 + b ; t5 = t4; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése (Dead Code Elimination) int* x; int a; int b; int c; x = new int(2); a = 4; c = a + b; set(x,a + b); t0 = 4 ; PushParam t0 ; t1 = LCall Alloc ; PopParams 4 ; t2 = 2 ; *(t1) = t2 ; t4 = 4 + b ; PushParam t4 ; PushParam t1; Call set; PopParams 8 ; Izsó Tamás Fordítás Optimalizálás / 61

Felesleges utasítások törlése Értékadás bal oldalán található változó akkor felesleges, ha az értékét a későbbiekben nem használjuk fel. Ha az értékadás bal oldalán található változó felesleges, akkor az egész utasítást el lehet hagyni. Izsó Tamás Fordítás Optimalizálás / 62