Compilers

Welke code ontstaat uiteindelijk als op de bovenstaande code herhaaldelijk constant propagation en constant folding worden toegepast?

int n = 8;
int m = n * 2;
return m + 1;
  1. Areturn n * 2 + 1;
  2. Breturn 8 * 2 + m;
  3. Creturn 17;
Antwoord en toelichting tonen

Antwoord: C. return 17;

Bij constant propagation wordt, omdat n de waarde 8 krijgt en daarna niet wordt gewijzigd, n op de plaatsen waar het wordt gebruikt vervangen door 8, zodat m = 8 * 2. Constant folding berekent 8 * 2 tot 16, dus m = 16, en met verdere propagation en folding wordt m + 1 gelijk aan 16 + 1 = 17. De toewijzingen aan n en m worden niet meer gebruikt en worden als dode code verwijderd, zodat alleen return 17; overblijft. Vormen die halverwege zijn gestopt of waarbij de vervanging foutief is uitgevoerd, zijn niet het eindresultaat.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Welke uitspraak is juist over wat gebeurt als op de bovenstaande code common subexpression elimination wordt toegepast?
  2. Wat wordt bij het verwijderen van dode code (dead code elimination) verwijderd?
  3. Welke combinatie van voordeel en nadeel van het inlinen (inline expansion) van functies is juist?
  4. Welk effect van loop unrolling is juist?
  5. Welke berekening in de bovenstaande lus komt in aanmerking voor loop-invariant code motion (verplaatsing buiten de lus)? (x en y worden in de lus niet gewijzigd.)

Vergelijkingen bij dit onderwerp