Odstranění běžných podvýrazů

Odstranění společných podvýrazů ( angl.  Common subexpression eliminace nebo CSE) je optimalizace kompilátoru , která hledá v programu výpočty , které se v uvažované sekci provádějí více než jednou, a pokud je to možné a efektivní , odstraňuje druhou a další stejné operace . Tato optimalizace vyžaduje analýzu toku datpro hledání nadbytečných výpočtů a téměř vždy zkracuje dobu provádění programu při použití [1] .

Zobecněný popis problému

Podvýraz v programu se nazývá společný podvýraz , pokud existuje jiný takový podvýraz, který je vždy vyhodnocen před daným a operandy se mezi vyhodnoceními nemění. Například v níže uvedeném příkladu je výraz b * c obecným podvýrazem.

Na základě této definice je odstranění společných podvýrazů transformací , která eliminuje opakované vyhodnocování společných podvýrazů a nahrazuje je použitím hodnoty uložené po prvním vyhodnocení. V uvažovaném příkladu však není možné při výpočtu d okamžitě nahradit společný podvýraz hodnotou proměnné a, protože tato proměnná se může mezi příslušnými výpočty měnit.

Zvažte následující fragment kódu:

a = b * c + g ; d = b * c * d _

Platí pro něj následující transformace:

tmp = b * c ; a = tmp + g ; d = tmp * d ;

což bude účinné, pokud je celkový čas pro zápis a několik čtení nové proměnné "tmp" menší než celkový čas strávený vyhodnocením výrazu "b * c" pokaždé, když se v kódu objeví.

Existují dva typy této optimalizace:

  • lokální odstranění společných podvýrazů , které funguje v rámci stejné lineární oblasti ;
  • globální mazání společných podvýrazů , které funguje v rámci celé procedury.

Obě optimalizace jsou založeny na analýze toku dat, během kterého se zjišťuje dostupnost výrazu v každém bodě programu.

Princip

Optimalizační aplikace je založena na analýze dostupných výrazů . Výraz x + yje dostupný v určitém bodě pprogramu, pokud: [2]

  • podél libovolné cesty od počátečního uzlu k pvýrazu se x + yvyhodnocuje, dokud není dosaženo bodu p;
  • mezi vyhodnocením výrazů a dosažením bodu pnedochází k žádné změně hodnot proměnných xa y.

Účinnost převodu je dána především skutečností, že celková doba zápisu a několika čtení nové proměnné „tmp“ se ukáže být menší než celková doba strávená vyhodnocením výrazu „b * c“ pokaždé, když se objeví v kód. V praxi ovlivňuje výslednou efektivitu i řada dalších faktorů, zejména distribuce proměnných mezi registry .

Benefit

V jednoduchých případech, jako je ten diskutovaný výše, je odstraněna duplikace výpočtů aritmetických výrazů. Tato optimalizace je nejvýznamnější pro vnitřní reprezentaci kompilátoru, například při výpočtu indexů polí, kde je ruční optimalizace velmi obtížná nebo nemožná. V některých programovacích jazycích je možné vytvořit mnoho stejných výpočtů. Například makra jazyka C, která ve zdrojovém kódu netvoří stejné výrazy, ale po nahrazení názvu makra při zpracování preprocesorem posloupností programových instrukcí se taková mohou objevit.

V případě globální aplikace optimalizace ovlivňují přínos další kritéria. Například je třeba vzít v úvahu počítadla provádění základních bloků, protože snížením statického počtu vyhodnocení výrazů můžete zvýšit dynamické číslo, což negativně ovlivňuje počet operací prováděných v programu. To vede k tomu, že zpětná optimalizace související s třídou PRE (partial redundancy eliminace) může být přínosná.

Poznámky

  1. Advanced Compiler Design and Implementation, 1997 , str. 377.
  2. Kompilátory: principy, technologie a nástroje, 2008 , str. 735.

Literatura

  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Kompilátory : Principy, techniky a nástroje = Kompilátory: Principy, techniky a nástroje. — 2. vydání. - M .: "Williams", 2008. - 1184 s. - 1500 výtisků.  - ISBN 978-5-8459-1349-4 .
  • Steven S. Muchnick. Pokročilý návrh a implementace kompilátoru. — 5. vydání. - San Francisco: Morgan Kaufmann Publishers , 1997. - s. 378-396. — 856 s. - ISBN 1-55860-320-4 .
  • John Cocke . "Global Common Subexpression Elimination." Proceedings of a Symposium on Compiler Construction , ACM SIGPLAN Notices 5(7), červenec 1970, strany 850-856.
  • Briggs, Preston, Cooper, Keith D. a Simpson, L. Taylor. "Číslování hodnot." Software-Practice and Experience , 27(6), červen 1997, strany 701-724.