Eliminarea subexpresiilor comune

Eliminarea subexpresiilor comune ( ing.  Eliminarea subexpresiilor comune sau CSE) este o optimizare a compilatorului care caută calcule în program care sunt efectuate de mai multe ori în secțiunea luată în considerare și elimină a doua și următoarele operații identice, dacă este posibil și eficient . Această optimizare necesită analiza fluxului de datepentru găsirea calculelor redundante și aproape întotdeauna îmbunătățește timpul de execuție a programului atunci când este aplicat [1] .

Descrierea generalizată a problemei

O subexpresie dintr-un program se numește subexpresie comună dacă există o altă astfel de subexpresie care este întotdeauna evaluată înaintea celei date, iar operanzii nu se schimbă între evaluări. De exemplu, în exemplul de mai jos, expresia b * c este o subexpresie generală.

Pe baza acestei definiții, eliminarea subexpresiilor comune este o transformare care elimină evaluarea repetată a subexpresiilor comune și le înlocuiește cu utilizarea valorii stocate după prima evaluare. Cu toate acestea, în exemplul luat în considerare, este imposibil să se înlocuiască imediat subexpresia comună cu valoarea variabilei a atunci când se calculează d, deoarece această variabilă se poate modifica între calculele în cauză.

Luați în considerare următorul fragment de cod:

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

I se aplică următoarea transformare:

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

care va fi eficient dacă timpul total pentru scriere și mai multe citiri ale noii variabile „tmp” este mai mic decât timpul total petrecut evaluând expresia „b * c” de fiecare dată când aceasta apare în cod.

Există două tipuri de această optimizare:

  • ștergerea locală a subexpresiilor comune , care funcționează în aceeași regiune liniară ;
  • ștergerea globală a subexpresiilor comune , care funcționează în cadrul întregii proceduri.

Ambele optimizări se bazează pe analiza fluxului de date, timp în care se determină disponibilitatea expresiei în fiecare punct al programului.

Principiul

Aplicația de optimizare se bazează pe analiza expresiilor disponibile . O expresie x + yeste disponibilă la un moment dat în pprogram dacă: [2]

  • de-a lungul oricărei căi de la nodul de pornire la pexpresie este x + yevaluată până la atingerea punctului p;
  • între evaluarea expresiilor și atingerea punctului pnu există nicio modificare a valorilor variabilelor xși y.

Eficiența conversiei este determinată în principal de faptul că timpul total de scriere și mai multe citiri ale noii variabile „tmp” se dovedește a fi mai mic decât timpul total petrecut pentru evaluarea expresiei „b * c” de fiecare dată când apare în cod. În practică, o serie de alți factori afectează, de asemenea, eficiența finală, în special distribuția variabilelor între registre .

Beneficiu

În cazuri simple, precum cel discutat mai sus, duplicarea calculelor expresiilor aritmetice este eliminată. Această optimizare este cea mai semnificativă pentru reprezentarea internă a compilatorului, de exemplu, atunci când se calculează indici de matrice, unde optimizarea manuală este foarte dificilă sau imposibilă. În unele limbaje de programare, este posibil să se formeze multe calcule identice. De exemplu, macro -urile din limbajul C, care în codul sursă nu formează aceleași expresii, dar după înlocuirea numelui macro în timpul procesării de către preprocesor cu o secvență de instrucțiuni de program, pot apărea astfel.

În cazul unei aplicări globale a optimizării, criteriile suplimentare afectează beneficiul. De exemplu, este necesar să se țină seama de contoarele de execuție ale blocurilor de bază, deoarece prin reducerea numărului static de evaluări de expresie, puteți crește numărul dinamic, ceea ce afectează negativ numărul de operații efectuate în program. Acest lucru duce la faptul că optimizarea inversă legată de clasa PRE (eliminare parțială a redundanței) poate fi benefică.

Note

  1. Advanced Compiler Design and Implementation, 1997 , p. 377.
  2. Compilatorii: principii, tehnologii și instrumente, 2008 , p. 735.

Literatură

  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Compilatoare : Principles, Techniques, and Tools = Compilatoare: Principles, Techniques, and Tools. — ediția a II-a. - M . : „Williams”, 2008. - 1184 p. - 1500 de exemplare.  - ISBN 978-5-8459-1349-4 .
  • Steven S. Muchnick. Proiectare și implementare avansată a compilatorului. — ediția a 5-a. - San Francisco: Morgan Kaufmann Publishers , 1997. - pp. 378-396. — 856 p. - ISBN 1-55860-320-4 .
  • John Cocke . „Eliminarea globală a subexpresiilor comune”. Proceedings of a Symposium on Compiler Construction , ACM SIGPLAN Notices 5(7), iulie 1970, paginile 850-856.
  • Briggs, Preston, Cooper, Keith D. și Simpson, L. Taylor. „Numerarea valorii”. Software-Practice and Experience , 27(6), iunie 1997, paginile 701-724.