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

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

Java II. I A Java programozási nyelv alapelemei

Java II. I A Java programozási nyelv alapelemei

Programok értelmezése

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

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

Pénzügyi algoritmusok

A C# programozási nyelv alapjai

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

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

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

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

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

OOP #14 (referencia-elv)

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

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

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

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

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

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

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

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

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

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

Informatika terméktervezőknek

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

A JavaScript főbb tulajdonságai

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

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

A programozás alapjai

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

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

Készítette: Nagy Tibor István

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

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.

Stack Vezérlés szerkezet Adat 2.

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

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

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

Objektumorientált Programozás VI.

Rekurzió. Dr. Iványi Péter

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

Kiterjesztések sek szemantikája

Szoftverminőségbiztosítás

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

Apple Swift kurzus 3. gyakorlat

Programozási nyelvek (ADA)

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

Programozás C és C++ -ban

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

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?

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

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

PE/COFF fájl formátum

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

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

Programozási nyelvek Java

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

Készítette: Nagy Tibor István

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)

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

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

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

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

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

Bevezetés a programozásba I.

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

Mutatók és mutató-aritmetika C-ben március 19.

Pénzügyi algoritmusok

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

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

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

1. Egyszerű (primitív) típusok. 2. Referencia típusok

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

3. Gyakorlat Ismerkedés a Java nyelvvel

Adatelérés és memóriakezelés

3. Osztályok II. Programozás II

C programozási nyelv

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

Programozási nyelvek JAVA EA+GY 1. gyakolat

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

Programozási nyelvek 6. előadás

Bevezetés a C++ programozási nyelvbe

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

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

és az instanceof operátor

A C programozási nyelv III. Pointerek és tömbök.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

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

Átírás:

Fordító Optimalizálás Kód visszafejtés. Izsó Tamás 2012. szeptember 27. 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

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 / 5

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 / 6

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

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 / 8

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 / 9

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 / 10

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 / 11

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 / 12

Szintaktikia analízisre példa function ident main 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 / 13

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 / 14

Miért használunk közbenső kódot (Intermediate reprezentáció) AST Assembly IR előny gépfüggetlen; hátrány túl magaszintű. 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 / 15

Intermediate Language (IL) IL a közbenső ábrázolás (IR) nyelvtani szabályait tartalmazza minden fordító saját IL-t használ; 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 / 16

Intermediate Reprezentáció 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 / 17

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 / 18

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 / 19

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 / 20

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 / 21

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 / 22

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 / 23

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 / 24

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 / 25

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 / 26

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 / 27

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

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 / 29

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 bibát okoz a kód futásánál; sokáig tart a kódgenerálás. Legtöbb optimalizálási algoritmusok NP-teljes, ha egyáltalán létezik megoldás. Izsó Tamás Fordítás Optimalizálás / 30

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 / 31

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 / 32

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 / 33

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 / 34

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 / 35

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 / 36

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 / 37

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 / 38

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 / 39

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 / 40

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 / 41

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 / 42

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 / 43

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 / 44

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 / 45

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 / 46

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Lokális optimalizálás i n t main ( ) { 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 / 47

Globális optimalizálás i n t main ( ) { 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 / 48

Globális optimalizálás i n t main ( ) { 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 / 48

Globális optimalizálás i n t main ( ) { 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 / 48

Globális optimalizálás i n t main ( ) { 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 / 48

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 / 49

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 / 49

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 / 49

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 / 49

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 / 50

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 51

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 / 52

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 53

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 / 54