Compilers

Welke uitspraak is juist over wat gebeurt als op de bovenstaande code common subexpression elimination wordt toegepast?

x = (a + b) * c;
y = (a + b) * d;
  1. Aa + b wordt maar één keer berekend en in een tijdelijke variabele gezet, die in de twee expressies wordt hergebruikt
  2. Bx en y zijn gelijkende expressies, dus de berekening van een van beide wordt verwijderd
  3. CVermenigvuldigingen worden door optellingen vervangen om de berekening lichter te maken
Antwoord en toelichting tonen

Antwoord: A. a + b wordt maar één keer berekend en in een tijdelijke variabele gezet, die in de twee expressies wordt hergebruikt

Common subexpression elimination is een optimalisatie waarbij, als dezelfde waarde herhaaldelijk wordt berekend, die maar één keer wordt berekend en het resultaat wordt hergebruikt. In dit voorbeeld wordt t = a + b berekend en worden x = t * c en y = t * d gebruikt, zodat één optelling minder nodig is. Er moet echter worden gecontroleerd dat a en b tussen de twee expressies niet worden overschreven. x en y zijn verschillende waarden, zodat niet een van beide kan worden verwijderd. Het vervangen van vermenigvuldigingen door lichtere bewerkingen is een andere optimalisatie, strength reduction.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Wat wordt bij het verwijderen van dode code (dead code elimination) verwijderd?
  2. Welke combinatie van voordeel en nadeel van het inlinen (inline expansion) van functies is juist?
  3. Welk effect van loop unrolling is juist?
  4. 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.)
  5. Welke transformatie is juist als in de bovenstaande lus strength reduction wordt toegepast op de indexberekening i * 4?

Vergelijkingen bij dit onderwerp