Překladače 2 Analýza toku dat Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci 15. listopad, 2012 Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 1 / 33
Lokální analýza: živost proměnných neformálně: proměnná je živá, pokud její hodnota bude přečtena nějakou operací předtím, než její hodnota bude opět změněna pro operaci x = y op z platí: x těsně před touto operací není živá proměnná y a z jsou živé před touto operací Eliminace mrtvého kódu určí se živost proměnných všechna přiřazení k proměnným, které nejsou živé, se odstraní Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 2 / 33
Příklad: živé proměnné (1/3) a = b c = a d = a + b e = d d = a f = e Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 3 / 33
Příklad: živé proměnné (2/3) 6. {b} a = b 5. {a, b} c = a 4. {a, b} d = a + b 3. {a, b, d} e = d 2. {a, b, e} d = a 1. {b, d, e} f = e 0. {b, d} Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 4 / 33
Příklad: živé proměnné (3/3) 6. {b} a = b 5. {a, b} c = a 4. {a, b} d = a + b 3. {a, b, d} e = d 2. {a, b, e} d = a 1. {b, d, e} f = e 0. {b, d} Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 5 / 33
Analýza toku dat běh programu posloupnost transformací stavu programů provedení operace IR transformace vstupního stavu na výstupní = bod programu před a po operaci má smysl uvažovat vstupní a výstupní bod bloku platí: v rámci základního bloku je bod programu za operací shodný s bodem před následující operací pokud vede hrana z bloku B 1 do B 2, pak bod programu za poslední operací bloku B 1 může být okamžitě následován bodem před prvním operací bloku B 2 Definition Cesta z bodu p 1 do p n je posloupnost bodů programu p 1,..., p n taková, že pro každé i = 1,..., n 1 platí bud : 1 p i předchází operaci a p i+1 okamžitě následuje dané operaci, 2 p i představuje konec bloku a p i+1 představuje začátek bloku následujícího. Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 6 / 33
Analýza toku dat obecně lze aplikovat na různé problémy (propagace kopíı, eliminace shodných podvýrazů) hodnota datového toku abstrakce všech možných stavů v daném bodě programu doména množina možných hodnot datového toku (např. potenční množina všech proměnných) závisí na typu problému analýza datového toku: pro každý příkaz s najít hodnoty IN[s] a OUT[s] představující hodnoty datového toku před provedením příkazu a po jeho provedení hodnoty jsou určeny (1) sémantikou operace s, (2) tokem řízení programu problém se řeší zakódováním do tzv. tokových rovnic, respektujícím (1), (2) rovnice řešeny iterativním způsobem Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 7 / 33
Přechodová funkce a základní bloky vztah hodnot IN[s] a OUT[s] je určen přechodovou funkcí f s podle směru předávání informací určujeme dopředný tok: OUT[s] = f s (IN[s]) zpětný tok: IN[s] = f s (OUT[s]) Základní bloky v případě základních bloků operace zprácovávány v řadě za sebou: pro základní blok B s příkazy s 1, s 2,..., s n platí: IN[s i+1 ] = OUT[s i ] pro všechna i = 1, 2,..., n 1 budeme označovat: IN[B] = IN[s 1 ] OUT[B] = OUT[s n ] přechodová funkce pro blok B: f B = f sn... f s1 Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 8 / 33
Přechodová funkce a základní bloky dopředná analýza: zpětná analýza: OUT[B] = f B (IN[B]) IN[B] = OUT[P] P predchudce B IN[B] = f B (OUT[B]) OUT[B] = IN[S] S naslednik B Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 9 / 33
Dosah definice (1/2) pokud víme, kde mohla být definována proměnná x, když se program dostal do bodu p, lze určit, zda x je v bodě p konstanta nebo, zda je vůbec inicializována definice proměnné x je operace, která přiřazuje nebo může přiřazovat proměnné x hodnotu definice d proměnné x dosahuje do bodu p, pokud na cestě jdoucí přímo z d do p není jiná definice proměnné x uvažujme definici: d : u = v + w operace,,generuje definici d proměnné u a odstraňuje ostatní definice proměnné u přechodová funkce pro d: f d (x) = gen d (x kill d ) kde gen d = {d}, kill d množina všech ostatních definic proměnné u v programu. Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 10 / 33
Dosah definice (2/2) skládáním přechodových funkcí lze rozšířit na základní bloky, viz str. 604 pro základní bloky platí následující rovnice: OUT[Entry] = pro ostatní základní bloky B: OUT[B] = gen B (IN[B] kill B ) IN[B] = P predchudce B OUT[P] hledáme nejmenší pevný bod: Algoritmus 1 OUT[Entry] = 2 pro každý blok B mimo Entry: OUT[B] = 3 pokud došlo ke změně nějaké OUT[B], opakuj: 4 pro každý blok B mimo Entry: 5 IN[B] = P predchudce B OUT[P] 6 OUT[B] = gen B (IN[B] kill B ) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 11 / 33
Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 12 / 33
Analýza živých proměnných (1/2) Proměnná x je živá v bodě p pokud existuje cesta začínající v bodě p, kde může být proměnná x použita, jinak je proměnná v daném bodě mrtvá. def B množina všech definovaných proměnných v bloku B předtím, než byly v bloku B použity use B množina proměnných, jejichž hodnoty mohou být použity v B, aniž by byly definovány pro základní bloky platí následující rovnice: IN[Exit] = pro ostatní základní bloky B: IN[B] = use B (IN[B] def B ) OUT[B] = S naslednik B IN[S] na konci programu jsou všechny proměnné mrtvé proměnná je živá, pokud vstupuje do bloku před svou redefinicí nebo není v bloku předefinována proměnná je živá, pokud je použita v bloku, který je následovníkem Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 13 / 33
Analýza živých proměnných (2/2) 1 IN[Exit] = 2 pro každý blok B mimo Exit: IN[B] = 3 pokud došlo ke změně nějaké IN[B], opakuj: 4 pro každý blok B mimo Exit: 5 OUT[B] = S naslednik B IN[S] 6 IN[B] = use B (OUT[B] def B ) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 14 / 33
Analýza dostupných výrazů (1/2) Výraz x op y je dostupný v bodě p, pokud na každé cestě z počátečního uzlu do p dojde k vyhdnocení x op y a po posledním vyhodnocením před p nedojde ke změně x nebo y. Blok,,zabíjí výraz, pokud může měnit x nebo y. Blok,,generuje výraz x op y, pokud vždy daný výraz vyhodnotí a následně nezmění x nebo y. egen B množina všech generovaných výrazů v bloku B ekill B množina zabitých výrazů v bloku B pro základní bloky platí následující rovnice: OUT[Entry] = pro ostatní základní bloky B: IN[B] = P predchuce B OUT[P] OUT[B] = egen B (IN[B] ekill B ) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 15 / 33
Analýza dostupných výrazů (2/2) 1 OUT[Entry] = 2 pro každý blok B mimo Entry: OUT[B] = U 3 pokud došlo ke změně nějaké OUT[B], opakuj: 4 pro každý blok B mimo Entry: 5 OUT[B] = egen B (IN[B] ekill B ) 6 IN[B] = P predchuce B IN[P] U množina všech výrazů, které se mohou objevit na pravé straně operace (,,počáteční odhad ) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 16 / 33
Framework analýzy datového toku Definition Framework analýzy datového toku je čtveřice D, V,, F, kde D je směr toku (Dopředný, Zpětný) V je polosvaz s operací průsek F množina přechodových funkcí f : V V taková, že obsahuje funkci I (x) = x pro všechna x z V a F je uzavřená vzhledem k operaci skládání funkcí. Definition Framework analýzy toku dat D, V,, F je monotonní pokud pro všechna x a y z V a f z F platí: x y f (x) f (y) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 17 / 33
Iterativní algoritmus pro obecný framework Vstup Výstup Postup graf toku dat s uzly Entry a Exit směr toku D množin hodnot V, operátor množina funkcí F, kde f B z F je přechodová funkce pro blok B konstanta v Entry nebo v Exit představující mezní případ pro dopřednou nebo zpětnou analýzu hodnoty V pro IN[B] a OUT[B] pro každý blok B v grafu toku dat pro každý blok B se opakovaně aproximují hodnoty IN[B] a OUT[B] Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 18 / 33
Algoritmus Dopředný tok 1 OUT[Entry] = v Entry 2 pro každý blok B mimo Entry: OUT[B] = 3 pokud došlo ke změně nějaké OUT[B], opakuj: 4 pro každý blok B mimo Entry: 5 IN[B] = P predchudce B OUT[P] 6 OUT[B] = f B (IN[B]) Zpětný tok 1 IN[Exit] = v Exit 2 pro každý blok B mimo Exit: IN[B] = 3 pokud došlo ke změně nějaké IN[B], opakuj: 4 pro každý blok B mimo Exit: 5 OUT[B] = S naslednik B IN[S] 6 IN[B] = f B (OUT[B]) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 19 / 33
Vlastnosti algoritmu pokud algoritmus konverguje, výsledek je řešením tokových rovnic pokud je framework monotonní, pak řešení je maximální pevný bod tokových rovnic (tj. pro jiná řešení platí, že hodnoty IN[B] a OUT[B] jsou vzhledem k maximálnímu pevnému bodu) pokud je framework monotonní a polosvaz je konečné výšky, pak algoritmus konverguje Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 20 / 33
Propagace konstant pro každý datový typ proměnné zavedeme polosvaz L t = D t {NAC, UNDEF},, kde Dt je množina hodnot, kterých může proměnná nabývat NAC představuje hodnotu,,není konstanta UNDEF představuje hodnotu,,hodnota není definována a platí: NAC v = NAC UNDEF v = v pro všechny hodnoty proměnné v c c = c pro všechny konstanty c c1 c 2 = NAC pro všechny vzájemně různé konstanty c 1 a c 2 Parametry algoritmu: Hodnoty datového toku doména: součin polosvazů L = L t1... L tn, kde každá složka představuje jednu proměnnou programu hodnota datového toku budeme označovat jako m, kde m(v) představuje hodnotu proměnné v z definice: m m = m pokud m (v) = m(v) m (v) pro všechny proměnné v Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 21 / 33
Další parametry algoritmu směr: dopředný Množina přechodových funkcí uvažujeme pouze přechodové funkce pro jednotlivé operace (pro bloky lze odvodit skládáním) funkce ve tvaru: f : L L F obsahuje funkce: fi (m) = m, pro všechna m L (identita) f0 (m) = m 0, pro všechna m L, kde m 0 (v) = UNDEF pro všechny proměnné v přechodové funkce fs pro obecný příkaz s pro přechodovou funkci f s a všechna m a m z L taková, že m = f s (m) platí: (1) pokud s není přiřazení, pak f s = f i (2) pokud s je přiřazení proměnné x, pak m (v) = m(v) pro všechny proměnné v x a m (x) je definováno: Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 22 / 33
Další parametry algoritmu...dokončení bodu (2)... a m (x) je definováno: (a) pokud je pravá strana výrazu konstanta: m (x) = c (b) pokud je pravá strana výrazu ve tvaru y z m (x) = m(y) m(z), pokud m(y) a m(z) jsou konstanty m (x) = NAC, pokud m(y) nebo m(z) jsou NAC m (x) = UNDEF, jinak (c) pokud je pravá stran jiný typ výrazu (např. volání fce.), pak m (x) = NAC. Poznámky funkce z F jsou monotonní algoritmus konverguje (viz (B)) pokud se objeví UNDEF v kódu, neexistuje cesta, na které by byla definice dané proměnné pokud existuje cesta s definicí proměnná, proměnná nemá hodnotu UNDEF (plyne z definice ) algoritmus může nalézt více konstant než by měl v případě nedefinovaných hodnot může zvolit tuto konstantu jako hodnotu (viz str. 638) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 23 / 33
Odstraňování redundance Globální společné podvýrazy výraz y z je (plně) redundantní v bodě p pokud je v daném bodě dostupný (bude spočítaný na všech cestách do p a nedojde následně po tomto výpočtu k redefinici y a z) výraz y z je částečně redundantní v bodě p pokud existuje cesta do p, kde je výraz y z spočítaný a nedošlo následně k redefinici y a z Invariant cyklu výraz x = y z je invariant cyklu, pokud y a z nejsou v cyklu redefinovány přesun výrazu mimo smyčku a uložení hodnoty do pomocné proměnné v optimalizovaném kódu by se nemělo by se provést víc instrukcí než v neoptimalizovaném (problém, pokud smyčka končí dřív než dojde k vyhodnocení výrazu) jedno z možných řesení pro while while (c) { if (c) { S; ----> do { S;} while (c); } } Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 24 / 33
Líné přesouvání kódu odstranění redundance požadujeme následující vlasnosti: všechny redundantní výpočty, které lze odstranit bez duplikace kódu, jsou odstraněny program neprovádí žadný výpočet, který by nebyl proveden v originálním kódu výrazy jsou vyhodnoceny v nejzazším možném bodě algoritmus se snaží vložit kopii výrazu, aby byl výraz plně redundantní Umístění výrazu Výraz x y je očekávaný (anticipated) v bodě p, pokud všechny cesty vedoucí z tohoto bodu v nějakém bodě spočítají hodnotu x y s použitím hodnot x a y, které jsou dostupné v bodě p. Výraz x y je odložitelný (postponable) v bodě p, pokud je očekávaný a bude použitý na každé cestě jdoucí tímto bodem. Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 25 / 33
Nástin algoritmu 1 nalezení očekávaných výrazů pro každý bod programu 2 vložení očekávaných výrazů, kde jsou poprvé očekávány + analýza dostupnosti 3 přesun výrazů na místa, kde už nejsou odložitelné 4 odstranění proměnných, které jsou použité pouze jednou Přípravný krok každý příkaz je ve svém bloku pokud má blok více předků, je vložen nový blok mezi počátek a konec této každé hrany pro každý blok máme množiny: euseb množina výrazů spočítaných v B ekillb množina výrazů, jejichž operandy jsou definovány v B Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 26 / 33
Očekávané výrazy udávají místo, kam lze vložit výpočet výrazu dřívější umístění umožní redukovat více redundance pozdější umístění redukuje čas nutnný k držení výpočtu výrazu v registru výraz je očekávaný na vstupu do bloku, pokud je generovaný daným blokem (euse B ) výraz je očekávaný na výstupu z bloku, pokud je očekávaný na vstupu do bloku a nejsu předefinovány jeho operandy v daném bloku (ekill B ) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 27 / 33
Nalezení očekávaných výrazů Parametry algoritmu Doména množina výrazů Směr zpětný Přechodová funkce f B (x) = euse B (x ekill B ) Hraniční stav IN[Exit] = Průsek Rovnice IN[B] = f B (OUT[B]) OUT[B] = S naslednik B IN[S] Inicializace IN[B] = U Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 28 / 33
Dostupnost výrazů mírně odlišná přechodová funkce: výraz je dostupný na výstupu z bloku, pokud: je dostupný na vstupu do bloku nebo je očekávaný v daném bloku (tj. lze jej spočítat) a není,,zabitý v daném bloku Doména Směr Přechodová funkce Hraniční stav Průsek Rovnice Inicializace množina výrazů dopředný f B (x) = (anticipated[b].in x) ekill B OUT[Entry] = OUT[B] = f B (IN[B]) IN[B] = P predchudce B OUT[P] OUT[B] = U anticipated[b].in výsledek předchozího kroku algoritmu earliest[b] = anticipated[b].in available[b].in první místa vhodná pro výpočet výrazu Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 29 / 33
Odložitelnost výrazů odloží vykonání výrazu na nejzazší mez výraz x y je odložitelný (postponeable) do bodu p, pokud dřívější umístění x y leží na každé cestě z Entry do p a neexistuje další použítí x y za tímto umístěním výraz je odložitelný na konci bloku, pokud není použitý v daném bloku a pokud je výraz odložitelný na vstupu do daného bloku nebo je v earliest[b] výraz je odložitelný na začátek bloku, pokud je odložitelný ve všech jeho předchůdcích (na výstupu z bloku) Doména množina výrazů Směr dopředný Přechodová funkce f B (x) = (erliest[b].in x) euse B Hraniční stav OUT[Entry] = Průsek Rovnice OUT[B] = f B (IN[B]) IN[B] = P predchudce B OUT[P] Inicializace OUT[B] = U Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 30 / 33
Odložitelnost výrazů umístění výrazu e na hranici, kde se výraz stáva z odložitelného,,neodložitelným výraz e může být umístěn na začátek bloku B pokud e není v postponable[b].in, tj. e je použito e nelze přesunout do některého z následníků Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 31 / 33
Použité výrazy výraz je použitý (used) v bodě p, pokud existuje cesta z p taková, že výraz je použit předtím, než je opět vyhodnocen analýza živosti (ale pro výrazy) Doména Směr Přechodová funkce Hraniční stav Průsek Rovnice Inicializace množina výrazů zpětný f B (x) = (euse B x) latest[b] IN[Exit] = IN[B] = f B (OUT[B]) OUT[B] = S naslednik B IN[S] IN[B] = earliest[b] = anticipated[b].in available[b].in latest[b] = (earliest[b] postponable[b].in) (euse B ( S naslednik B (earliest[s] postponable[s].in))) latest[b]... poslední místo, kam lze umístit výrazy Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 32 / 33
Přesun Pro každý výraz x y proved : pro všechny bloky B takové, že x y je v latest[b] used[b].out přidej t = x y na začátek B pro všechny bloky B takové, že x y je v nahrad x y proměnnou t euse B ( latest[b] used[b].out]) Petr Krajča (UP) KMI/PRKL2: Přednáška I. 15. listopad, 2012 33 / 33