Maschinenunabhängige Codeoptimierung Seminar: Übersetzung von künstlichen Sprachen Maschinenunabhängige Codeoptimierung Philip Demey
Agenda Einordnung und Motivation Optimierungsmöglichkeiten Datenflussanalyse Verfahren der Datenflussanalyse Zusammenfassung und Ausblick
Einordnung Dem Codegenerator optional vorgeschaltet Agiert global auf Flussgraph Maschinenunabhängig Optimierung im Sinne von Verbesserung
Motivation 3AC erzeugt temporäre Variablen Konstrukte höherer Programmiersprachen z. B. durch Arrayzugriff Redundanzen und teure Operationen Ziel: Vermeidung von Ineffizienz Entfernung unnötiger Befehle Ersetzung von Befehlen Beispiel: a = b + c * d 3AC: t1 = c * d a = b + t1 Beispiel: b = a[i][j] 3AC: t1 = i * w1 t2 = j * w2 t3 = t1 + t2 b = a[t3] Beispiel: a = 8 * b
Optimierungsmöglichkeiten
Optimierungsmöglichkeiten 1/5 Globale gemeinsame Teilausdrücke Wiederverwendung einer Berechnung ohne Änderung der benötigten Werte
Optimierungsmöglichkeiten 2/5 Kopiepropagation Entfernung von Kopieranweisungen
Optimierungsmöglichkeiten 3/5 Eliminierung von totem Code Entfernung nicht genutzter Variablen
Optimierungsmöglichkeiten 4/5 Kostenreduzierung Ersetzung von teuren Operationen
Optimierungsmöglichkeiten 5/5 Codeverschiebung Verlagerung von Codeteilen aus Schleifen
„Oberste Direktive“ Semantikerhaltende Transformationen Sichere / Konservative Verfahren Keine Änderungen der Berechnungen Aber: Versäumung von Codeverbesserungen möglich Konservative Datenflussanalyse
Datenflussanalyse
Datenflussabstraktion Nur Extraktion der nötigen Informationen Beispiel: Verfügbare Ausdrücke Ausdruck x + y ist an Punkt p verfügbar: Alle Pfade zu p werten x + y aus Nach letzter Auswertung keine Zuweisung zu x oder y
Datenflussanalyse 1/3 Sammeln von Informationen Operiert auf Flussgraph Zustände an Programmpunkten Mathematischer Lösungsansatz Datenflussgleichungen
Datenflussanalyse 2/3 Pfade durch Flussgraph Informationen zu Anfang und Ende der Blöcke DFA-Framework Iterativer Algorithmus
Datenflussanalyse 3/3 Programmpunkte Definitionen Menge von Datenflusswerten Pfade: z. B. 1,2,3,4,5,6,7,8 z. B. 1,2,3,4,5,6,7,5,6,7,8
DFA-Framework Komponenten Datenflussrichtung Vorwärts oder rückwärts Halbverband Menge von Definitionen Durchschnittsoperator Familie von Transferfunktion Transformiert Datenflusswerte Ein- und Ausstiegsknoten im Datenflussgraph Initialisierungswerte für Ein- und Ausstiegsknoten
Iterativer Algorithmus (Vorwärts gerichteter Datenfluss)
Lösung des Datenflussproblems Iterativer Algorithmus konvergiert und findet Lösung (MFP) Ideallösung (IDEAL) nicht erreichbar Näherung möglich (Meet-over-Path, MOP) Es gilt: MFP ist sicher
Beispiel: Erreichende Definitionen Ziel: z. B. Ermittlung von Konstanten Definition d erreicht Punkt p, wenn d nicht auf Pfad zu p zerstört wird Definition d wird zerstört, wenn auf Pfad zu p eine andere Definition zur Variable existiert
Beispiel: Erreichende Definitionen Iterativer Algorithmus:
Verfahren der Datenflussanalyse
Konstantenpropagation 1/2 Ziel: Ausdrücke die bei jeder Ausführung konstant sind durch Konstante ersetzen Halbverband:
Konstantenpropagation 2/2 Transferfunktion (für x = y+z) Problem: m(y) m(z) m‘(x) UNDEF c2 NAC c1 c1+c2
Eliminierung teilweiser Redundanz 1/2 Ziel: Anzahl der Auswertungen reduzieren Globale gemeinsame Teilausdrücke Schleifeninvariante Ausdrücke Teilweise redundante Ausdrücke
Eliminierung teilweiser Redundanz 2/2 Mehrfacher Durchlauf erforderlich Evtl. Einfügen neuer Blöcke nötig Evtl. Duplizierung von Code nötig Wünschenswert: Alle Redundanzen entfernt, die ohne Codeduplizierung entfernt werden können Keine neuen Berechnungen Möglichst späte Berechnung von Ausdrücken
Schleifen in Flussgraphen Ziel: Natürliche Schleifen identifizieren Auswirkung auf die Laufzeit von Programmanalysen Algorithmus kann auf hierarischer Struktur operieren
Schleifen in Flussgraphen Konzepte zur Identifizierung z. B. Dominatorbaum, Spannbaum a dom b
Weitere Verfahren Bereichsbasierte Analyse Symbolische Analyse
Zusammenfassung und Ausblick
Zusammenfassung Optimierungsmöglichkeiten Datenflussanalyse als Werkzeug Generisches Datenflussanalyse-Framework Iterativer Algorithmus findet Lösung Optimierungen müssen sicher sein
Praxis: GCC GNU Compiler Collection: Hier C-Compiler Mehrere Optimierungslevel -o0 bis -o3 Einzeloptionen, z. B. -fmerge-constants -ftree-dominator-opts -funswitch-loops http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Ausblick Maschinenabhängige Optimierung Spezialgebiete Neue Methoden z. B. Parallelisierung Spezialgebiete z. B. Objektorientierte Programmierung Neue Methoden z. B. Static Single Assignment Form z. B. Convergent Compiling
Vielen Dank! Fragen?
Referenzquelle Aho, Lam, Sethi, Ullmann: Compiler – Prinzipien, Techniken und Werkzeuge, Addision-Wesley, 2008.
Spannbaum