Upload
others
View
13
Download
0
Embed Size (px)
Citation preview
Fordító részei Optimalizálás
Fordító –OptimalizálásKód visszafejtés.
Izsó Tamás
2013. október 9.
Izsó Tamás Fordítás –Optimalizálás / 1
Fordító részei Optimalizálás
Section 1
Fordító részei
Izsó Tamás Fordítás –Optimalizálás / 2
Fordító részei Optimalizálás
Irodalom
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
Fordító részei Optimalizálás
Irodalom“01-fm-i-viii-9780120884780” — 2011/1/13 — 15:54 — page ii — #2
Izsó Tamás Fordítás –Optimalizálás / 5
Fordító részei Optimalizálás
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 akód elemzéshez, melyeket a modern decompiler-ek.(Miért, amikor a fordító rendelkezésére áll az eredetiforrás?)
Izsó Tamás Fordítás –Optimalizálás / 6
Fordító részei Optimalizálás
Fordító részei
karakter sorozat
Lexikaielemzo
tokenek sorozata
Szintaktikaianalízis
absztrakt szintaktikai fa
Szemantikaiellenorzés
absztrakt szintaktikai fa
Közbensokódge-nerálás
szimbólum-tábla
hiba logolás
közbenso ábrázolás
Gépfüggetlenkódopti-malizáló
közbenso ábrázolás
Kódgenerátor
processzor függo kód
Gépi kódfüggo
optimalizálás
processzor függo kód
Izsó Tamás Fordítás –Optimalizálás / 7
Fordító részei Optimalizálás
Lexikai elemzo
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
Fordító részei Optimalizálás
Lexikai elemzo
double calc( double initial, double rate ) \n{ \n double position; \n position = initial+rate*100; \n return position; \n } \n
DOUBLEID
calc"(" DOUBLE
ID
initial
"," DOUBLEID
rate")" "{"
DOUBLEID
position";"
ID
position "="
ID
position "+"ID
rate"*"
NUMBER
100
";" "RETURN"ID
position";"
Izsó Tamás Fordítás –Optimalizálás / 9
Fordító részei Optimalizálás
Token
token – szintaktikai kategória, csoport;élo nyelvben: ige, foné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ípusegész konstans , valós konstans , sztring értéke;méret;élettartam;láthatóságstb.
nem token: szóköz, megjegyzés
Izsó Tamás Fordítás –Optimalizálás / 10
Fordító részei Optimalizálás
Blokk struktúra
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
Fordító részei Optimalizálás
Szimbólum tábla
a tokenizálás során keletkezett azonosítókat, és azazokhoz kapcsolódó attribútumokat tárolja;megorzi 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
Fordító részei Optimalizálás
Szintaktikia analízis
lexikai elemzés után tokenek sorozatát kapjuk;cél a program szerkezetének az értelmezése akörnyezetfüggetlen nyelvtani szabályok (context-freegrammar CFG) alapján (muveletek, 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
Fordító részei Optimalizálás
Szintaktikia analízisre eredménye
function
body
stmtlist
stmtlist
endRETURN
NUM100
=
+
*
NUM100
identrate
identinitial
identposition
declist
endidentposition
paramlist
paramlist
endidentrate
identinitial
identcalc
Izsó Tamás Fordítás –Optimalizálás / 14
Fordító részei Optimalizálás
Szemantikai analízis célja
Olyan hibák felderítése, amit a CFG-ben nehéz, vagy nemlehet megadni.További információk gyujté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
Fordító részei Optimalizálás
Miért használunk közbenso kódot (Intermediatereprezentáció)
Assemblyelony – alkalmas az optimalizálásra;hátrány – gépfüggo;hátrány – minden egyes processzorra újrakellene írni az optimalizálót.
IRelony – alkalmas az optimalizálásra;elony – gépfüggetlen.
Izsó Tamás Fordítás –Optimalizálás / 16
Fordító részei Optimalizálás
IR fajtái
Forrás program és a gépi kód közötti átmenet.Magas szintu — eredeti program visszaállítható (kivételmegjegyzések, tagolások). Felhasználják szintaxisvezérelt editorokban, pretty printing funkciókban. (pl.AST). A parser a fordításnál ezt állítja elo;Alacsony szintu — minden sora majdnem egy gépiutasításra fordítható;Közepes szintu — bizonyos struktúrákat megöriznek a jobboptimalizálás érdeképen. Például a magasszintu vezérlésiszerkezeteket 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
Fordító részei Optimalizálás
Intermediate Language (IL)
IL a közbenso ábrázolás (IR) nyelvtani szabályait tartalmazzaminden fordító saját IL-t használ, akár többet is;IL = magasszintu assembly nyelv
felhasználható regiszterek száma nincs korlátozva;assembly nyelv szintu vezérlési szerkezetekgépi utasításokat használnak, de egyes utasítások lehetnekmagasszintuek is
pl. call több assembly utasításra fordullegtöbb IL utasítás egy gépi utasításra fordítható
Izsó Tamás Fordítás –Optimalizálás / 18
Fordító részei Optimalizálás
Lineáris Intermediate Language típusai
egy operandusú (stack szervezésu gépek pl. JVM);két operandusú x ← x < op > y ;három operandusú z ← x < op > y ;
push 2push ymulpush xsub
egy operandusú
t1 = 2t2 = yt1 = t1 ∗ t2t3 = xt3 = t3 − t1
két operandusú
t1 = 2t2 = yt3 = t1 ∗ t2t4 = xt5 = t4 − t1
három operandusú
x − 2 ∗ y
Izsó Tamás Fordítás –Optimalizálás / 19
Fordító részei Optimalizálás
Adatfüggoségi gráf
1. loadAI r0, 0 → r12. add r1, r1 → r13. loadAI r0, 8 → r24. mult r1, r2 → r15. loadAI r0, 16 → r26. mult r1, r2 → r17. loadAI r0, 24 → r28. mult r1, r2 → r19. storeAI r1 → r0,0
ILOC kód
1
2
4
6
8
9
3
5
7
Izsó Tamás Fordítás –Optimalizálás / 20
Fordító részei Optimalizálás
Quadruples (négyes)
Muvelet Op1 Op2 EredményloadI 2 t1load y t2mult t1 t2 t3load x t4sub t4 t3 t5
Izsó Tamás Fordítás –Optimalizálás / 21
Fordító részei Optimalizálás
Triples (hármas)
A triples, indirekt triples ábrázolás csak ciklus éselágazásmentes, azaz alapblokkban alkalmazható. (Alapblokkdefiníciója késobb 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
Fordító részei Optimalizálás
Indirekt triples
Zárójelbe írt érték az adott utasításhoz rendelt [j] indexenkeresztül hivatkozik arra az utasításra, melynek az eredményéthaszná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
Fordító részei Optimalizálás
SSA static single assignment
x ← ...y ← ...whi le ( x < k ){
x ← x + 1 ;y ← y + x ;
}
x0 ← ...y0 ← ...i f (x0 ≥ k ) goto nextloop : x1 ← φ(x0, x2) ;
y1 ← φ(y0, y2) ;x2 ← x1 + 1 ;y2 ← y1 + x2 ;i f (x2 < k ) goto loop
next : . . . .
Izsó Tamás Fordítás –Optimalizálás / 24
Fordító részei Optimalizálás
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. Egyvá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énegy 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értelmu, mert aprogram különbözo ágán eljutva, több ágon is definiáltuk avá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 pontokbankaphatott értéket.
2 A φ függvény a fordítónak szól, belole kód nem keletkezik.3 A φ függvény paramétere minimum ketto, maximum akármennyi,
de csak indexben eltéro változó lehet.Izsó Tamás Fordítás –Optimalizálás / 25
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
Intermediate Language utasításkészlete
Logikai értékek0 – hamis;nem 0 – igaz.
Logikai muveletek:var3 = var2 == var1;var3 = var2 < var1;var3 = var2 || var1;var3 = var2 && var1;a többi logikai kifejezést ezek segítségével kell eloállítani.
Izsó Tamás Fordítás –Optimalizálás / 30
Fordító részei Optimalizálás
Intermediate Language
Vezérlésátadó utasítások:
névvel rendelkezo cimke L1:Goto label;IfZ value Goto label;IfZ csak a Goto utasítással együtt fordulhat elo;
Izsó Tamás Fordítás –Optimalizálás / 31
Fordító részei Optimalizálás
Intermediate Language
Függvényhívó utasítás:
LCall L1 – esetén a hívott függvény címe fordítási idobenismert.ACall t1 – t1 függvény címe futáskor áll elo (pl. virtuálisfüggvénytábla).
LCall L1;t1 = LCall L1;ACall t1 ;t0 = ACall t1 ;
Izsó Tamás Fordítás –Optimalizálás / 32
Fordító részei Optimalizálás
Intermediate Language
Függvény definiálás:
BeginFunc n; – Függvény törzsének a kezdete, ahol n aloká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énybol.
Izsó Tamás Fordítás –Optimalizálás / 33
Fordító részei Optimalizálás
Intermediate Language
Memória címzés:
t1 = ∗t2t1 = ∗(t2+offset )∗t1 = ∗t2∗(t1 + offset ) = ∗t2offset – negatív vagy pozitív egész érték.
Tömb:t1 [ t2 ] = t3t3 = t1 [ t2 ]az index operátor a C-ben megismert módon muködik.
Izsó Tamás Fordítás –Optimalizálás / 34
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
Section 2
Optimalizálás
Izsó Tamás Fordítás –Optimalizálás / 36
Fordító részei Optimalizálás
Miért van szükség optimalizálásra
AST-bol IR-re való egyszeru á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ákfor ciklusba, vagy a feltétel részbe írnak a ciklusvégrehajtása során nem változó kifejezéseket;
Izsó Tamás Fordítás –Optimalizálás / 37
Fordító részei Optimalizálás
A kód optimalizálása kihívást jelent
Cél:az eredményeket helyességét ne befolyásolja ;a leheto leghatékonyabb IR-t állítsa elo;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ánlétezik megoldás.
Izsó Tamás Fordítás –Optimalizálás / 38
Fordító részei Optimalizálás
A program szemamtikáját nem befolyásolóoptimalizálás
felesleges temporális változók megszüntetése;fordítási idoben ismert konstans kifejezések kiszámítása;ciklusban lévo invariáns részek kiemelése;ellenpéldaként meg lehet említeni (szemantikátbefolyásoló optimalizálás) a buborékos rendezéskicserélése gyorsrendezésre.
Izsó Tamás Fordítás –Optimalizálás / 39
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
IR megjelenítése
BeginFunc 40;t0 = LCal l ReadInteger ;a = t0 ;t1 = LCal l 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 ;LCal l P r i n t I n t ;PopParams 4;
EndFunc ;
Izsó Tamás Fordítás –Optimalizálás / 49
Fordító részei Optimalizálás
IR megjelenítése
BeginFunc 40;t0 = LCal l ReadInteger ;a = t0 ;t1 = LCal l 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 ;LCal l P r i n t I n t ;PopParams 4;
EndFunc ;
Izsó Tamás Fordítás –Optimalizálás / 50
Fordító részei Optimalizálás
IR megjelenítése
t0 = LCal l ReadInteger ;a = t0 ;t1 = LCal l ReadInteger ;b = t1 ;
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 ;
PushParam a ;LCal l P r i n t I n t ;PopParams 4;
L1
L0
Izsó Tamás Fordítás –Optimalizálás / 51
Fordító részei Optimalizálás
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ásasorán biztosan végrehajtódnak.Alapblokkok kezdete és vége :
a program elso utasítása az elso 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 kezdodik (kivéve azutolsót).
Izsó Tamás Fordítás –Optimalizálás / 52
Fordító részei Optimalizálás
Vezérlési folyamatgráf – Control Flow Gráf (CFG)
irányított gráfcsomópontjai az alapblokkok halmaza;az élek a blokkok végpontjából egy másik blokk belépésipontjá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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = t0;IfZ x Goto L0;
t1 = y;z = t1;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = t0;IfZ x Goto L0;
t1 = y;z = t1;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = t1;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = t1;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = t2;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = y;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = y;
end
Izsó Tamás Fordítás –Optimalizálás / 55
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = y;
end
Izsó Tamás Fordítás –Optimalizálás / 56
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = y;
t2 = y;x = y;
end
Izsó Tamás Fordítás –Optimalizálás / 56
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = 137;
t2 = y;x = 137;
end
Izsó Tamás Fordítás –Optimalizálás / 56
Fordító részei Optimalizálás
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 ;e lse
x = y ;}
t0 = 137;y = 137;IfZ x Goto L0;
t1 = y;z = 137;
t2 = y;x = 137;
end
Izsó Tamás Fordítás –Optimalizálás / 56
Fordító részei Optimalizálás
Ismétlodo kifejezések kiszuré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
Fordító részei Optimalizálás
Ismétlodo kifejezések kiszuré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
Fordító részei Optimalizálás
Ismétlodo kifejezések kiszuré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
Fordító részei Optimalizálás
Ismétlodo kifejezések kiszuré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
Fordító részei Optimalizálás
Ismétlodo kifejezések kiszuré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övetkezo transzformációt hajthatjuk végre
v1 = a op b· · ·
v2 = v1
Ezzel elhagyjuk az ismétlodo számításokat.lehetoséget teremtünk egy késobbi optimalizáláshoz.
Izsó Tamás Fordítás –Optimalizálás / 58
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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énkhivatkozni;Ha van egy értékadás
v1 = v2
és a továbbiakban a v1 és v2 operandusok értéke nemváltozik, akkor a következo transzformációt hajthatjukvégre
a = · · · v1 · · ·
lecseréljük:
a = · · · v2 · · ·
Ez a transzformáció késobb a segítségünkre lesz.
Izsó Tamás Fordítás –Optimalizálás / 60
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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
Fordító részei Optimalizálás
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ésobbiekben 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