Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Fordítás – KódoptimalizálásKód visszafejtés.
Izsó Tamás
2015. október 15.
Izsó Tamás Fordítás – Kódoptimalizálás / 1
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók
Angol irodalomban a Live Variables kifejezést használják,míg az azt felhasználó elemzést Liveness Analysis-nekhívják.Az aktív változók ismeretében lehet a feleslegesutasításokat megszüntetni.Egy változó a program egy pontján aktív, ha késobb azértéke felhasználásra kerül.
Izsó Tamás Fordítás – Kódoptimalizálás / 2
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
A feldolgozás az alapblokk végétol az eleje felé halad.A blokk végén lévo aktív változók halmazát az algoritmusalapján mi határozzuk meg.Amikor az a = b + c1 kifejezéshez érünk:
az a változót ki kell venni;a b és c változókat be kell tenni az az aktív változókhalmazába.
1Összeadás helyett tetszoleges egy és kétoperandusú kifejezés isszerepelhet.
Izsó Tamás Fordítás – Kódoptimalizálás / 3
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó
v változó definiálásav változó használatav változó újradefiniálásav változó értéke felesleges
v=x+y;
c=v+5;
v=z+w
Izsó Tamás Fordítás – Kódoptimalizálás / 4
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó
v változó definiálása
v változó használatav változó újradefiniálásav változó értéke felesleges
v=x+y;
c=v+5;
v=z+w
Izsó Tamás Fordítás – Kódoptimalizálás / 4
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó
v változó definiálásav változó használata
v változó újradefiniálásav változó értéke felesleges
v=x+y;
c=v+5;
v=z+w
Izsó Tamás Fordítás – Kódoptimalizálás / 4
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó
v változó definiálásav változó használatav változó újradefiniálása
v változó értéke felesleges
v=x+y;
c=v+5;
v=z+w
Izsó Tamás Fordítás – Kódoptimalizálás / 4
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó
v változó definiálásav változó használatav változó újradefiniálásav változó értéke felesleges
v=x+y;
c=v+5;
v=z+w
Izsó Tamás Fordítás – Kódoptimalizálás / 4
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változó globális analízise
start
p
v=x+y;
a=v+5;
end
v változó aktíva p pontban
start
p
v=x+y;
v=x+5;
end
v változó nem aktíva p pontban
start
p
v=v+5;
end
v változó aktíva p pontban
Izsó Tamás Fordítás – Kódoptimalizálás / 5
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;
d = a + b;
e = d;
d = a;
f = e;
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;
d = a + b;
e = d;
d = a;
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;
d = a + b;
e = d;
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;
d = a + b;
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;
c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása
{ b }a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 6
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
f = e;{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;{ a, b }c = a;{ a, b }
d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;{ a, b }
{ a, b }d = a + b;{ a, b, d }
e = d;{ a, b, e}
d = a;{ b, d, e}
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
a = b;
d = a + b;
e = d;
d = a;
Izsó Tamás Fordítás – Kódoptimalizálás / 7
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
a = b;
d = a + b;
e = d;
d = a;
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
a = b;
d = a + b;
e = d;
d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
a = b;
d = a + b;
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
a = b;
d = a + b;{a , b, d }
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
a = b;
{a , b }d = a + b;{a , b, d }
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása II
{ b }a = b;
{a , b }d = a + b;{a , b, d }
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 8
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }d = a + b;{a , b, d }
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 9
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }d = a + b;{a , b, d }
e = d;{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 9
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }d = a + b;{a , b, d }
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 9
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
a = b;
d = a + b;
d = a;
Izsó Tamás Fordítás – Kódoptimalizálás / 9
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása III
a = b;
d = a + b;
d = a;
Izsó Tamás Fordítás – Kódoptimalizálás / 10
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása III
a = b;
d = a + b;
d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 10
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása III
a = b;
d = a + b;
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 10
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása III
a = b;
{a , b }d = a + b;
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 10
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállítása III
{ b }a = b;
{a , b }d = a + b;
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 10
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }d = a + b;
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 11
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }d = a + b;
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 11
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
{ b }a = b;
{a , b }
{a , b }d = a;
{b , d }
Izsó Tamás Fordítás – Kódoptimalizálás / 11
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Felesleges kód törlése
a = b;
d = a;
Izsó Tamás Fordítás – Kódoptimalizálás / 11
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aktív változók eloállításának a formalizálása
Inn = (Outn − Killn) ∪Genn
Outn =
{BI n az utolsó blokk végén .
∪x∈succ(n)Inx máskülönben.
A kimenet van összehuzalozva az n után következobemenetek uniójával.∪-ból következik, hogy az inicializálás az üres halmazzaltörténik, kivéve a kezdo állapotot.Outn alapján számítjuk az Inn-t, tehát a számítás visszafelehalad.
Izsó Tamás Fordítás – Kódoptimalizálás / 12
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Reaching Definition analízis
Az analízis megadja, hogy a program egy adott pontján az xváltozó hol kapott értéket. Elágazások és ciklusok miatt többponton is definiálva2 lehet.
RDentry(p) =
{RDinit kezdetben .
∪p′∈pred(p) RDexit(p′) máskülönben.
RDexit(p) = (RDentry(p)\KillRD(p)) ∪GenRD(p)
2Itt a definíciót bovebb értelemben használjuk. Minden pont, ahol egyváltozó értéket kap definíciós pontnak hívjuk.
Izsó Tamás Fordítás – Kódoptimalizálás / 13
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Reaching Definition jelölések
Ha az x változót a p pontban definiálva van, akkor ezt a tényt a(x ,p) párral fejezzük ki. Az RDentry(p) és az RDexit(p) ezekneka pároknak a halmazát tartalmazza.
Inicializálás
RDinit = {(x , ?)|x ∈ programváltozó.}
A kérdojel azt jelenti, hogy még nem lett inicializálva a változó.
Izsó Tamás Fordítás – Kódoptimalizálás / 14
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Példa Reaching Definition-ra
[m := 2 ] 1 ;while [ n > 1 ] 2 do
[m := m ∗ n ] 3 ;[ n := n − 1] 4
end while[ stop ] 5
RDentry(1) = {(m, ?), (n, ?)}RDexit(1) = {(m,1), (n, ?)}
RDentry(2) = RDexit(1) ∪ RDexit(4)
Izsó Tamás Fordítás – Kódoptimalizálás / 15
| Vezérlésfolyam analízis Kód struktúra visszafejtése
RD végeredmény
RDentry RDexit1 {(m,?),(n,?)} {(m,1),(n,?)}2 {(m,1),(m,3),(n,?),(n,4)} {(m,1),(m,3),(n,?),(n,4)}3 {(m,1),(m,3),(n,?),(n,4)} {(m,3),(n,?),(n,4)}4 {(m,3),(n,?),(n,4)} {(m,3),(n,4)}5 {(m,1),(m,3),(n,?),(n,4)} {(m,1),(m,3),(n,?),(n,4)}
Izsó Tamás Fordítás – Kódoptimalizálás / 16
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Konstans kiértékelés fordítási idoben I
RD ` [x := a]` B [x := a[y 7→ n]]`
ha
y ∈ FV (a) ∧ (y , ?) /∈ RDentry(`) ∧∀(y ′
, `′) ∈ RDentry(`) ∧
y′= y ⇒ [. . .]`
′= [y := n]`
′
RD ` [x := a]` B [x := n]`
ha
{FV (a) = ∅ ∧ a nem konstans ∧a kifejezés értéke n
Izsó Tamás Fordítás – Kódoptimalizálás / 17
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Konstans kiértékelés fordítási idoben II
RD ` S1 B S′
1
RD ` S1;S2 B S′1;S2
RD ` S2 B S′
2
RD ` S1;S2 B S1;S′2
RD ` S1 B S′
1
RD ` if[b`] then S1 else S2 B if[b`] then S′1 else S2
RD ` S2 B S′
2
RD ` if[b`] then S1 else S2 B if[b`] then S1 else S′2
RD ` S B S′
RD ` while[b`] do S Bwhile[b`] do S′
Izsó Tamás Fordítás – Kódoptimalizálás / 18
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Konstans kiértékelés példa I.
Program:
[ x :=10 ] 1 ; [ y := x+10]2 ; [ z := y+10]3 ;
RD analízis eredménye:
RDentry(1) = {(x , ?), (y , ?), (z, ?)}RDexit(1) = {(x ,1), (y , ?), (z, ?)}
RDentry(2) = {(x ,1), (y , ?), (z, ?)}RDexit(2) = {(x ,1), (y ,2), (z, ?)}
RDentry(3) = {(x ,1), (y ,2), (z, ?)}RDexit(2) = {(x ,1), (y ,2), (z,3)}
Izsó Tamás Fordítás – Kódoptimalizálás / 19
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Konstans kiértékelés példa II.
RD ` [x := 10]1; [y := x + 10]2; [z := y + 10]3;
B [x := 10]1; [y := 10 + 10]2; [z := y + 10]3;
B [x := 10]1; [y := 20]2; [z := y + 10]3;
B [x := 10]1; [y := 20]2; [z := 20 + 10]3;
B [x := 10]1; [y := 20]2; [z := 30]3;
Izsó Tamás Fordítás – Kódoptimalizálás / 20
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Konstans kiértékelés példa II.
Visual Studio C eredménye
1 int funcion() {2 int x,y,z;3 x=1;4 y=100*x;5 z=100*y-y;6 while( x < 4 ) {7 z = z +y;8 y = 2*x;9 x++;
10 }11 return z;12 }
Lefordított kód:_func ion :
00000000: mov eax ,2710h00000005: r e t
Izsó Tamás Fordítás – Kódoptimalizálás / 21
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Section 1
Vezérlésfolyam analízis
Izsó Tamás Fordítás – Kódoptimalizálás / 22
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Domináns alapblokk
A Bi alapblokk akkor domináns Bj felett, ha az entrypontból a j-edik blokkig minden lehetséges úton eljutvaérinteni kell a Bi blokkot.Minden blokk domináns önmagával.(a dom b) ∧ (b dom c)→ (a dom c).Közvetlen, vagy szomszédos dominanciáról akkorbeszélünk, ha a dom b és a 6= b esetén nem létezik olyanc, hogy (a dom c) ∧ (c dom b).Posztdominanciáról akkor beszélünk, ha a Bj blokkból azexit, blokk fele haladva minden úton érintjük a Bk blokkot.
Izsó Tamás Fordítás – Kódoptimalizálás / 23
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Struktúrális analízis – dominancia
fib(m)
f1=1
f0=0
m<=1
return f2
f1=1
m >= 1
f2=f0+f1
f0=f1
f1=f2
m=m-1
return 1
Entry
exit
B1
B2
B3
B4
B5
B6
Entry
B1
B2 exit B3
B4
B5 B6
Izsó Tamás Fordítás – Kódoptimalizálás / 24
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Domináns alapblokk
m
n
D(n) az n-re domináns alapblokkokhalmazaPred(n) az irányított vezérlésifolyamatgráf alapján az n-be meno élekforrás csomópontjai
D(n) = {n} ∪⋂
p∈pred(n)
D(p)
Izsó Tamás Fordítás – Kódoptimalizálás / 25
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Dominancia meghatározása
procedure Dom_Comp( N, Pred, r )N : in set of Node;Pred : in Node→ set of Node;r : in Node;
beginD, T : set of Node;n, p : Node;change:=true: boolean;Domin : Node→ set of Node;for each n ∈ N - {r} do Domin(n):=N;repeat
change := false;for each n ∈ N - {r} do
T:=N;for each p ∈ Pred(n) do
T ∩ = Domin(p) ;od;D := { n } ∪ T;if D 6= Domin(n) then
change := true;Domin(n) := D;
fi;od;
until !changereturn Domin
Izsó Tamás Fordítás – Kódoptimalizálás / 26
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Depth-First Search
Mélységi keresés
A
B
C
D
E
F
G
H
A
B
C
D
E
F
G
H
A B C D E E D C B A F G H H G F A
A F D E E D F G H H G F A B C C B A
előre
hátra
keresztbe
Jelölés:PRE: APOST: A
Izsó Tamás Fordítás – Kódoptimalizálás / 27
| Vezérlésfolyam analízis Kód struktúra visszafejtése
DFS algoritmusN : in set of Node;r, x : Nodei:=1, j:=1 : integer;Pre, Post : Node→ integer;Visit: Node→ boolean;Etype: (Node x Node )→ enum{ tree, forward, back, cross };
procedure Deap_First_Search( N, Succ, x )N : in set of Node;Succ : in Node→ set of Node;x : in Node;
beginy : Node;Visit(x) := true;Pre(x) := j;j = j + 1;
for each y ∈ Succ(x) doif !Visit(y) then
Deep_First_Search(N,Succ,y);EType(x→ y) := tree;
elif Pre(x) < Pre(y) thenEType(x→ y) := forward;
elif Post(y) = 0 thenEType(x→ y) := back;
elseEType(x→ y) := cross;
fi;od;Post(x) := i; i :+= 1;
end
beginfor each x ∈ N do;
Visit(x) := false;Pre(x) := Post(x) := 0;
odDeep_First_Search(N,Succ,r);
end
Izsó Tamás Fordítás – Kódoptimalizálás / 28
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Section 2
Kód struktúra visszafejtése
Izsó Tamás Fordítás – Kódoptimalizálás / 29
| Vezérlésfolyam analízis Kód struktúra visszafejtése
CFG struktúrájának az analízis
célja felismerni a magasszintu vezérlési szerkezeteketif ... then ..., if ... then ... else ..., switch ... case ...for, while, repeat;
nem struktúrált részben lévo blokkok számának aminimalizálása.
Izsó Tamás Fordítás – Kódoptimalizálás / 30
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Gráf alapfogalmak
A
B
C
D
E
F
G
H
G – irányított gráf, N –csomópontok halmaza, E – élekhalmaza;G = 〈N,E〉 ;N = {A,B,C,D,E ,F ,G,H}E ⊆ N × N = {A→ B,A→F ,B → C,C → B,C → D,C →E ,D → E ,F → D,F → G,G→H,G→ H}Succ(b) = {n ∈ N|∃e ∈ E hogye = b → n}Pred(b) = {n ∈ N|∃e ∈ E hogye = n→ b}
Izsó Tamás Fordítás – Kódoptimalizálás / 31
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aciklikus struktúrák
B1
B3
B2B3
B4
B5
B6
B7
B2
B4
B2
B4
B1
B2 B3 B4 B5 B6blokk
if-the-else if-then
case-switch
Izsó Tamás Fordítás – Kódoptimalizálás / 32
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklikus struktúrák
B1
B0
self-loop
B2
while-loop
B1
B2
természetes loop
B1
B2
(improper) nem struktúrált szerkezet
B3
Izsó Tamás Fordítás – Kódoptimalizálás / 33
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Struktúra meghatározása
Globális adatok:
Succ, Pred : Node→ set of Node;RegionType = enum { Block, IfThen, IfThenElse, Case, Proper, SelfLoop,
WhileLoop, NaturalLoop, Improper } ;// Blokk hozzárendelése az ot tartalmazó összevont struktúráhozStructOf: Node→ Node;// Összevont struktúra típusa (pl. if-then)StructType: Node→ RegionType;// Összevont struktúrák halmazaStructures: set of Node;// Összevont struktúra alá tartozó blokkokStructNodes : Node→ set of Node;// Összevont struktúra hierarchiájaCTNodes: set of Node;CTEdges : set of Node x Node;PostCtr, PostMax:integer;Post: integer→ Node;Visit: Node→ boolean;
Izsó Tamás Fordítás – Kódoptimalizálás / 34
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklus keresés
k
n
m
vissza
n pont a ciklus kezdete;∃k ∈ N pont, ahol
Pred(n) = k ;∃ olyan m pont, hogy n-bolm-be és m-bol k -ba van út.
Izsó Tamás Fordítás – Kódoptimalizálás / 35
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklus keresés
k
n
m
vissza n pont a ciklus kezdete;
∃k ∈ N pont, aholPred(n) = k ;∃ olyan m pont, hogy n-bolm-be és m-bol k -ba van út.
Izsó Tamás Fordítás – Kódoptimalizálás / 35
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklus keresés
k
n
m
vissza n pont a ciklus kezdete;∃k ∈ N pont, ahol
Pred(n) = k ;
∃ olyan m pont, hogy n-bolm-be és m-bol k -ba van út.
Izsó Tamás Fordítás – Kódoptimalizálás / 35
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklus keresés
k
n
m
vissza n pont a ciklus kezdete;∃k ∈ N pont, ahol
Pred(n) = k ;∃ olyan m pont, hogy n-bolm-be és m-bol k -ba van út.
Izsó Tamás Fordítás – Kódoptimalizálás / 35
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Strukturális analízis
Procedure StructuralAnalysis(N, E, entry)N : in set of Node;E: in set of (Node x Node);entry: in Node;
beginm, n, p : Node;rtype : RegionType;NodeSet, ReachUnder: set of Node;StuctOf := StructType := ∅;Stuctures := StructNodes := ∅;CTNodes := N; CTEdges := ∅;repeat
Post := ∅; Visit := ∅PostMax := 0; PostCtr := 1DFS_Postorder(N, E, entry );while |N| > 1∧ PostCtr ≤ PostMax do
n := Post(PostCtr) ;rtype :=AcyclicRType(N,E,rtype,NodeSet);if rtype 6= nil then
p:= Reduce(N,E,rtype,NodeSet) ;if entry ∈ NodeSet then entry := p; fi;
else
ReachUnder := {n};for each n ∈ N do
// ∃k amely vissza élen eljut n-be és,// ∃m pont, amihez van n→ m,// és m→ k -ba él.if PathBack(m,n) then
ReachUnder ∪ = {m};fi;
od;rtype :=CyclicRType(N,E,rtype,
ReachUnder);if rtype 6= nil then
p:= Reduce(N,E,rtype,ReachUnder) ;if entry ∈ ReachUnder then
entry := p;fi
elsePostCtr += 1;
fifiod;
until |N| = 1;end
Izsó Tamás Fordítás – Kódoptimalizálás / 36
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Blokkok DFS bejárása
Procedure DFS_Postorder(N, E, x)N : in set of Node;E: in set of (Node x Node);x: in Node;
beginy : Node;Visit(x):=true;for each y ∈ Succ(x) do
if !Visit(y) thenDFS_Postorder(N,E,y);
if;od;PostMax+= 1;Post(PostMax) := x;
end
Izsó Tamás Fordítás – Kódoptimalizálás / 37
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Aciklikus struktúrák feltérképezése
Procedure AcyclicRType(N,E,node,nset) : RegionTypeN : in set of Node;E: in set of (Node x Node);node: inout Node;nset: out set of Node;
beginm, n : Node;p, s: boolean;nset := ∅;n := node; p := true; s := |Succ(n)| = 1;while p ∧ s do
nset ∪ = {n}; n := �Succ(n);p := |Pred(n)| = 1; s := |Succ(n)| = 1;
od;if p then
nset ∪ = {n};fin := node; p := |Pred(n)| = 1; s:=true;while p ∧ s do
nset ∪ = {n}; n := �Pred(n);p := |Pred(n)| = 1; s := |Succ(n)| = 1;
od
if s thennset ∪ = {n};
finode := n;if |nset | ≥ 2 then
return Block;elif |Succ(node)| = 2 then
m := Succ(node); n:= (Succ(node)-{m});if Succ(m) = Succ(n)∧ |Succ(m)| = 1∧ |Succ(n)| = 1∧ |Pred(m)| = 1∧ |Pred(n) = 1| thennset := {node,m,n};return IfThenElse;
elif . . .. . .
elsereturn nil;
fi;fi;
end
Izsó Tamás Fordítás – Kódoptimalizálás / 38
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Ciklikus struktúrák feltérképezése
Procedure CyclicRType(N,E,node,nset) : RegionTypeN : in set of Node;E: in set of (Node x Node);node: in Node;nset: inout set of Node;
beginm : Node;if |nset | = 1 then
if node→ node ∈ E thenreturn SelfLoop;
elsereturn nil;
fi;fi;if ∃m ∈ nset !Path(node,m,N) then
nset := MinimizeImproper(N,E,node,nset);return Improper;
fi
m := �(nset - { node });if |Succ(node)| = 2∧ |Succ(m)| = 1∧|Pred(node)| = 2 ∧ |Pred(m) = 1| thenreturn WhileLoop;
elsereturn NaturalLoop;
fi;end
Izsó Tamás Fordítás – Kódoptimalizálás / 39
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Redukció
B1
Entry
B2
exit
B3
B4 B5
B6
B7
Entrya
B2a
exit
B3
B4 B5a
B7
Entryb
exit
B3
B4 B5b
Entryb
exit
B3a
Entryc
Izsó Tamás Fordítás – Kódoptimalizálás / 40
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Improper struktúrák kezelése
Fubo Zhang és Erik H. D’Hollander bebizonyították, hogy az általuk definiálthárom elemi programtranszformációs lépés
Forward Copy,Backward Copy,Cut
segítségével minden nem strukturált programrész strukturált formává alakítható.Módszerüket magasszintu blokk strukturált programozási nyelvre alkalmazták.
Haicheng Wu és társai kisebb átalakításokkal a módszert assembly szintuprogramra is alkalmazhatóvá tették.
Cikkek:Fubo Zhang and Erik H. D’Hollander. Using hammock graphs to structureprograms. IEEE Trans. Software Eng., 30(4):231-245, 2004.
Haicheng Wu, Gregory Diamos, Jin Wang, Si Li, and Sudhakar Yalamanchili.Characterization and transformation of unstructured control flow in bulksynchronous gpu applications. Int. J. High Perform. Comput. Appl.,26(2):170-185, May 2012.
Izsó Tamás Fordítás – Kódoptimalizálás / 41
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Forward CopyA következo ábrán a {B1,B2} és a {B3,B4} blokkok IfThenszerkezetet alkotnának, ha az E1 és E2 szaggatott élek nemszerepelnének.
Forward Copy transzformáció:1 Forward copy transzformáció során az IfThen szerkezetet
alkotó {B1,B2} részgráf közös pontja B3 és az E2 él közötttalálható gráfot le kell másolni.
2 A (B2,B3) él végpontját a megismételt struktúra B‘3 pontjáraállítani.
Az így kapott jobb oldali ábra {B3,B4} szerkezetére a forwardcopy transzformációt megismételve a gráf reducibilissé válik.
Izsó Tamás Fordítás – Kódoptimalizálás / 42
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Forward Copy transzformáció
E'1E2E1E2E1
B'3
B'4
B'5
Exit
Entry
B4
B5
B3
B2
B1
Exit
Entry
B4
B5
B3
B2
B1
Izsó Tamás Fordítás – Kódoptimalizálás / 43
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Backward CopyA következo ábrán található ciklus improper, mivel a belsejébe aB1 blokkokból az E1 élen keresztül be tudunk ugrani.
Backward Copy transzformáció:1 A ciklust alkotó blokkokat meg kell ismételni (backward copy).
Ezzel megszüntethetjük a ciklus belsejébe történo ugrást.2 A C1 élet a megismételt ciklusra kell állítani.
A struktúra továbbra is irreducibilis maradt, mivel a {B1,B2,B3}IfThen szerkezetnek két kilépési pontja van, de ezt már az elobbismertetett forward copy transzformációval megszüntethetjük.
Izsó Tamás Fordítás – Kódoptimalizálás / 44
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Backward Copy transzformáció
C'1
C1
C1
B'2B2
E1
Exit
Entry
B4
B5
B3
B1
B'5
B'3
B'4
B2
E1
Exit
Entry
B4
B5
B3
B1
Izsó Tamás Fordítás – Kódoptimalizálás / 45
| Vezérlésfolyam analízis Kód struktúra visszafejtése
CutA következo ábrán a ciklus belsejébol az E1 és az E2 élekenkeresztül is kiléphetünk, tehát ciklust több kilépési ponttal isrendelkezik.
1 Ciklus végét és a kilépés okát tartalmazó változók bevezetése.2 "compare cycle" blokk bevezetése. A ciklus szervezését erre
kell építeni.3 "compare from" blokk bevezetése. Kilépés okának megfelelo
folytatás elkészítése.
Izsó Tamás Fordítás – Kódoptimalizálás / 46
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Cut transzformáció
from==B5
from==B4 B6
compare from
B6 cycle==false
cycle:=falsefrom:=B5
cycle:=truefrom:=B5
B5
cycle==true
cycle:=falsefrom:=b4
cycle==false
E2
B2
E1
Exit
Entry
B4
compare cycle
B3
B1
cycle==true
B2
E1
Exit
Entry
B4B5
B3
B1
Izsó Tamás Fordítás – Kódoptimalizálás / 47
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Gondolatok a strukturált programozásról
improper — keresztél — irreducibilis — nem struktúráltDahl – Dijkstra – Hoare , Strukturált programozás 7.fejezet, A programok megértésérolwww.hit.bme.hu/~izso/struct_prog.pdf
Donald E. Knuth, Stuctured Programming with gotoStatesmentsLinux: Using goto In Kernel CodeC-ben a break, continue valóban megsérti a strukturáltprogramozás elvét, avagy irreducibilis lesz a CFG(vezérlésfolyan gráf) ?
Izsó Tamás Fordítás – Kódoptimalizálás / 48
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
Intel x86 processzor utasításkészlete kevés regiszterttartalmaz;néhány regiszter használata korlátozott;a gyors futás érdekében az adatokat érdemes aregiszterben tartani;ha nincs elég regiszter, ki kell menteni a memóriába;minimalizálni kell az egyidejuleg használt regiszterekszámát;általában színezési problémára vezetheto vissza.
Izsó Tamás Fordítás – Kódoptimalizálás / 49
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
s1
s2
s3
s4
s6
s5
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
s1
s2
s3
s4
s6
s5
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
s1
s2
s3
s4
s6
s5
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Regiszter hozzárendelés
s1 = 2
s2 = 4
s3 = s1 + s2
s4 = s3 + 1
s5 = s1 * s2
s6 = s4 * s5
s1 s2 s3 s4 s5 s6
s1
s2
s3
s4
s6
s5
Izsó Tamás Fordítás – Kódoptimalizálás / 50
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Egyéb optimalizálási eljárások
aritmetikai egyszerusítés: x = 4 * a;→ x = a « 2;konstans kifejezés kiértékelése: 4 * 1024→ 4096
Izsó Tamás Fordítás – Kódoptimalizálás / 51
| Vezérlésfolyam analízis Kód struktúra visszafejtése
Optimalizált kód visszafejthetosége
megjegyzések elvesznek;szimbólikus nevek elvesznek;adattípusok elvesznek;ciklus átrendezés, és kifejtés (unrolling);különbözo lokális változók azonos regiszterekben cserélikegymást ;algebrai átírás;kódmozgás;
Izsó Tamás Fordítás – Kódoptimalizálás / 52