Abschluss¶
Offene Themen¶
Statische Code-Analyse¶
- Beispiel: Lesen uninitialisierter Variablen
c
ist sicher nicht initialisiert,b
abhängig vomif
- Evtl. ist aber die
if
-Bedingung immer gegeben. Problem ist nicht absolut entscheidbar
- Konservativ behandeln: Programmpfade analysieren, die möglich sind
- Nächstes Beispiel:
c
ist sicher= 3
- Wieder Pfade anschauen. Wenn eine Variable auf allen Pfaden den gleichen Wert hat, ist dieser Konstant -> optimierbar
- Mit
while
istc
nicht mehr konstant - Pfad schliesst sich wieder, es muss durchiteriert werden, bis keine Änderungen mehr passieren
Single Static Assignment¶
- Bei Wiederverwendung von Variablen
- Optimierung: Jede Variable wird genau einmal zugewiesen (Variablen "indexieren")
- Problematisch bei Verzweigungen
- Die -Funktion entscheidet, welcher Pfad genommen wird
- Wenn einmal SSA durchgeführt ist, kann man einfach "Dead Code" erkennen, wenn Variablen nie gelesen werden
Common Subexpression Elimination¶
- Wiederholt ausgewertete Teilausdrücke identifizieren
- Diese in eine temp-Variable / oder besser Register vorberechnen
- Basiert ebenfalls auf SSA
Partial Redundancy Elimination¶
- Doppelter / Redundanter Code erkennen
- In allen Codepfaden den Code duplizieren, in allen Fällen wird dann der Ausdruck nur einmal ausgewertet
Peephole Optimization¶
- Ein "Fenster" von z.B. 3 Instruktion über den IL-Code laufen lassen
- Optimierungen innerhalb dieses "Gucklochs"
- Konstante Expressions können so direkt ausgewertet werten
- Laufzeit ist voraussehbar anhand der Grösse des Peepholes