Static-Single-Assignment-Form



Ähnliche Dokumente
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

1 Mathematische Grundlagen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Was meinen die Leute eigentlich mit: Grexit?

Primzahlen und RSA-Verschlüsselung

Lineare Gleichungssysteme

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Professionelle Seminare im Bereich MS-Office

Grundlagen der Theoretischen Informatik, SoSe 2008

Was ist Sozial-Raum-Orientierung?

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

FlowFact Alle Versionen

Anleitung über den Umgang mit Schildern

Theoretische Grundlagen der Informatik

Der Zwei-Quadrate-Satz von Fermat

Adminer: Installationsanleitung

Erstellen von x-y-diagrammen in OpenOffice.calc

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Unterrichtsmaterialien in digitaler und in gedruckter Form. Auszug aus: Übungsbuch für den Grundkurs mit Tipps und Lösungen: Analysis

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.

AutoCAD Dienstprogramm zur Lizenzübertragung

Einführung in. Logische Schaltungen

Zeichen bei Zahlen entschlüsseln

Die Post hat eine Umfrage gemacht

How to do? Projekte - Zeiterfassung

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Einfügen von Bildern innerhalb eines Beitrages

! " # $ " % & Nicki Wruck worldwidewruck

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Grundbegriffe der Informatik

Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer

P = U eff I eff. I eff = = 1 kw 120 V = 1000 W

1 topologisches Sortieren

LU-Zerlegung. Zusätze zum Gelben Rechenbuch. Peter Furlan. Verlag Martina Furlan. Inhaltsverzeichnis. 1 Definitionen.

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Eva Douma: Die Vorteile und Nachteile der Ökonomisierung in der Sozialen Arbeit

Festigkeit von FDM-3D-Druckteilen

Codex Newsletter. Allgemeines. Codex Newsletter

.NET Code schützen. Projekt.NET. Version 1.0

PowerPoint 2010 Mit Folienmastern arbeiten

Das Leitbild vom Verein WIR

Version 0.3. Installation von MinGW und Eclipse CDT

Menü auf zwei Module verteilt (Joomla 3.4.0)

Anleitung: Einrichtung der Fritz!Box 7272 mit VoIP Telefonanschluss

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

WS 2013/14. Diskrete Strukturen

Abschlussprüfung Realschule Bayern II / III: 2009 Haupttermin B 1.0 B 1.1

Übung Theoretische Grundlagen

Zählen von Objekten einer bestimmten Klasse

Zur drittletzten Zeile scrollen

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

INDEX. Öffentliche Ordner erstellen Seite 2. Offline verfügbar einrichten Seite 3. Berechtigungen setzen Seite 7. Öffentliche Ordner Offline

a n auf Konvergenz. Berechnen der ersten paar Folgenglieder liefert:

Erstellen einer digitalen Signatur für Adobe-Formulare

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Lehrer: Einschreibemethoden

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Konzepte der Informatik

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Prozentrechnung. Wir können nun eine Formel für die Berechnung des Prozentwertes aufstellen:

YouTube: Video-Untertitel übersetzen

Second Steps in eport 2.0 So ordern Sie Credits und Berichte

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Kurzanleitung zur Bereitstellung von Sachverhalten und Lösungen zum Universitätsrepetitorium auf dem Server unirep.rewi.hu-berlin.

Warum reicht Zähneputzen nicht?

Simulation LIF5000. Abbildung 1

Programmierkurs Java

Welche Lagen können zwei Geraden (im Raum) zueinander haben? Welche Lagen kann eine Gerade bezüglich einer Ebene im Raum einnehmen?

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Wir machen neue Politik für Baden-Württemberg

Lichtbrechung an Linsen

Wichtige Forderungen für ein Bundes-Teilhabe-Gesetz

Eine der Aktien hat immer einen höheren Gewinn als die andere Aktie. Ihre Aufgabe ist es diese auszuwählen.

Regeln für das Qualitäts-Siegel

1. Man schreibe die folgenden Aussagen jeweils in einen normalen Satz um. Zum Beispiel kann man die Aussage:

AZK 1- Freistil. Der Dialog "Arbeitszeitkonten" Grundsätzliches zum Dialog "Arbeitszeitkonten"

Entladen und Aufladen eines Kondensators über einen ohmschen Widerstand

Künstliches binäres Neuron

Arbeiten mit UMLed und Delphi

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Festplatte defragmentieren Internetspuren und temporäre Dateien löschen

Einfache kryptographische Verfahren

Step by Step Webserver unter Windows Server von Christian Bartl

Kapitalerhöhung - Verbuchung

Programmentwicklungen, Webseitenerstellung, Zeiterfassung, Zutrittskontrolle

Berechnungen in Access Teil I

SEPA Lastschriften. Ergänzung zur Dokumentation vom Workshop Software GmbH Siemensstr Kleve / /

Informationsblatt Induktionsbeweis

Datenübernahme von HKO 5.9 zur. Advolux Kanzleisoftware

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Einführung in die Java- Programmierung

Erfahrungen mit Hartz IV- Empfängern

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Anleitung SEPA-Lastschriften mit VR-NetWorld Software 5

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

2.11 Kontextfreie Grammatiken und Parsebäume

PRAXISBUTLER ANPASSUNG DER VORLAGEN

WORKSHOP für das Programm XnView

Transkript:

Static-Single-Assignment-Form

Compilerbau Static-Single-Assignment-Form 195 Static-Single-Assignment-Form besondere Darstellungsform des Programms (Zwischensprache) vereinfacht Datenflussanalyse und damit Optimierungstechniken des Compilers ist in vielen Compilern inzwischen Standard wird benötigt, um das MiniJava-Front-End an die LLVM-Compiler-Infrastruktur anzuschließen

Compilerbau Static-Single-Assignment-Form 196 Static-Single-Assignment-Form Ein Programm ist in SSA-Form, wenn jede Variable nur an einer Stelle im Programm definiert wird. Diese Definitionsstelle kann aber beliebig oft durchlaufen werden. Jede Variable kann beliebig oft benutzt werden. Jede Variable wird vor ihrer ersten Benutzung definiert. Bei Programmen in SSA-Form kann jede Benutzung einer Variablen genau einer Definition zugeordnet werden.

Compilerbau Static-Single-Assignment-Form 197 Vorteile Vereinfacht Datenfluss- und Optimisierungs-Techniken deutlich: Jeder Variablen kann man direkt ansehen, wo sie definiert wurde. Ohne SSA-Form muss man dazu erst eine Programmanalyse (Reaching Definitions) durchführen. vereinfacht z.b. constant propagation: Entferne Zuweisungen der Form x 14 4 und ersetze alle Vorkommen von x 14 durch 4. oder dead code elimination: Entferne Zuweisungen der Form x 14 a op b, wenn x 14 sonst nicht vorkommt. SSA-Form muss nur einmal berechnet werden

Compilerbau Static-Single-Assignment-Form 198 Vorteile Die Benutzung der SSA-Form ist wegen seiner Vorteile weit verbreitet, z.b. in GCC, LLVM, JITs in HotSpot oder V8,.... Betrachte LLVM als Beispiel: LLVM ist eine flexible Compiler-Infrastruktur, die LLVM-Assembler-Code mit verschiedenen Techniken optimiert und in verschiedene Zielplattformen übersetzt. LLVM kann Code-Optimierung und -Generierung im MiniJava-Compiler übernehmen, so dass wir uns ganz auf das Front-End konzentrieren können. LLVM-Assemblercode muss in SSA-Form sein.

Compilerbau Static-Single-Assignment-Form 199 Umwandlung in SSA-Form Jedes Programm kann in SSA-Form gebracht werden, wenn auf sogenannte φ-knoten zurückgegriffen wird. Ein solcher φ-knoten definiert eine Variable in Abhängigkeit von der Stelle, von der der φ-knoten erreicht wurde....... a 3 φ(a 4, a 7 ) Ein Knoten a 3 φ(a 4, a 7 ) im Kontrollflussgraph entspricht a 3 a 4, wenn sie vom ersten Vorgänger erreicht wurde, und a 3 a 7, wenn sie vom zweiten Vorgänger erreicht wurde. Eine φ-funktion hat immer so viele Argumente wie Vorgängerknoten.

Compilerbau Static-Single-Assignment-Form 200 Kontrollflussgraph Ein Kontrollflussgraph erfasst alle möglichen Läufe eines Programms. Jede Instruktion im gegebenen Programm entspricht einem Knoten des Kontrollflussgraphen. Für jeden Lauf des Programms gibt es einen Pfad im Kontrollflussgraphen. Die Umkehrung muss nicht gelten, der Kontrollflussgraph muss das Programmverhalten nur approximieren. a 0 L 1 : b a + 1 c c + b a b 2 if a < N goto L 1 return c a 0 L 1 : b a + 1 c c + b a b 2 if a < N goto L 1 return c

Compilerbau Static-Single-Assignment-Form 201 Umwandlung in SSA-Form r 0 i 0 if i < l if l = 0 if i = 0 mod 2 return r r r + i r r i i i + 1 1. Kontrollflussgraph berechnen

Compilerbau Static-Single-Assignment-Form 202 Umwandlung in SSA-Form r 0 i 0 if l = 0 r ϕ(r, r) i ϕ(i, i) if i < l if i = 0 mod 2 r r + i r r i r ϕ(r, r) return r r ϕ(r, r) i i + 1 2. Instruktionen der Form a φ(a, a) an Zusammenflüssen einfügen, wenn a abhängig vom Pfad verschiedene Werte haben kann

Compilerbau Static-Single-Assignment-Form 203 Umwandlung in SSA-Form r 1 0 i 1 0 if l 1 = 0 r 3 ϕ(r 8, r 1 ) i 3 ϕ(i 8, i 1 ) if i 3 < l 1 if i 3 = 0 mod 2 r 4 ϕ(r 3, r 1 ) return r r 6 r 3 + i 3 r 7 r 3 i 3 r 8 ϕ(r 6, r 7 ) i 8 i 3 + 1 3. Für jede Definition von a neue Variable a i verwenden und Benutzungen von a umbenennen

Compilerbau Static-Single-Assignment-Form 204 Umwandlung eines Programms in SSA-Form Wir gehen im Folgenden von einem Kontrollflussgraphen aus, der einen eindeutigen Anfangsknoten s 0 hat. Außerdem werden der Einfachheit halber gleich am Anfang alle Variablen pseudo-definiert (z.b. mit a uninitialized). Ein Join-Knoten im Kontrollflussgraph ist ein Knoten, der mehr als einen Vorgänger hat, an dem also zwei Pfade zusammenlaufen.

Compilerbau Static-Single-Assignment-Form 205 Einfügen von φ-knoten Am einfachsten ist es, an allen Join-Punkten φ-knoten der Form v φ(v, v) für alle Variablen v einzufügen, und dann die Variablen in ihre jeweiligen Versionen umzubenennen. Dadurch werden im Allgemeinen aber viel zu viele φ-knoten eingefügt, was die auf SSA-Form aufbauenden Algorithmen wieder verlangsamt.

Compilerbau Static-Single-Assignment-Form 206 Intelligenteres Einfügen von φ-knoten Stattdessen sollte ein φ-knoten für v genau dann an einem Join-Punkt eingefügt werden, wenn es einen Pfad P von einer Definition von v zu dem Join-Punkt gibt, der nicht notwendigerweise durchlaufen werden muss, d.h. wenn ein von P disjunkter Pfad von s 0 zu dem Join-Punkt existiert. a... a... a φ(a, a) P Solche Join-Punkte können mit der Dominanzrelation auf dem Kontrollflussgraphen ermittelt werden.

Compilerbau Static-Single-Assignment-Form 207 Dominanzknoten Ein Knoten d dominiert einen Knoten n, wenn jeder Pfad von s 0 nach n durch d läuft. Jeder Knoten dominiert sich selbst. Kontrollflussgraph 1 Dominanzbaum 1 2 2 3 5 4 3 4 5 6 7 6 8 7 8 d dominiert n, wenn ein Pfad von d zu n existiert. Jeder Knoten hat höchstens einen direkten Dominanzknoten (immediate dominator), weshalb man von einem Dominanzbaum spricht.

Compilerbau Static-Single-Assignment-Form 208 Dominanzgrenze Die Dominanzgrenze (dominance frontier) eines Knotens x besteht aus allen Knoten w, für die eine der folgenden beide Eigenschaften gilt: x dominiert einen Vorgänger von w, nicht aber w selbst. w = x und x dominiert einen Vorgänger von w. Intuitiv heißt das, dass man von s 0 zu w nicht notwendigerweise über einen Pfad von x nach w muss (und w der erste Knoten auf dem Pfad mit dieser Eigenschaft ist). Die Dominanzgrenze kann man als Grenze zwischen dominierten und nicht-dominierten Knoten verstehen. Dominanzgrenze von 3 ist {3, 4} 1 2 3 5 6 7 4 8

Compilerbau Static-Single-Assignment-Form 209 Dominanzgrenze Liegt w in der Dominanzgrenze von x, gibt es disjunkte Pfade von s 0 zu w und von x zu w. Wenn also Knoten x eine Definition von a ist, muss an jedem Knoten w in der Dominanzgrenze von x ein φ-knoten a φ(a, a,..., a) eingefügt werden. (Dieser φ-knoten ist selbst wieder eine Definition von a, weshalb der Algorithmus iterativ durchgeführt werden muss.)

Compilerbau Static-Single-Assignment-Form 210 Umbenennung Umbenennung: Wenn v in Knoten n definiert wird, verwende einen neuen Namen v n in der Definition. Wenn v in Knoten n benutzt wird, bennene v in v u um, wobei u die unmittelbar vorangehende Definition von v ist (d.h. die reaching definition von v an der Stelle u). Im Buch werden verschiedene effiziente Algorithmen zur Berechnung von Dominanzrelation und -grenzen sowie zur Umbennenung der Variablen vorgestellt, auf die hier nicht weiter eingangen wird.

Compilerbau Static-Single-Assignment-Form 211 Rückumwandlung in ausführbaren Code Nach der Optimierung können wir das Programm wieder in ein ausführbares Programm umwandeln, indem die entsprechenden Zuweisungsoperationen hinter den Vorgängern eingefügt werden und die φ-knoten entfernt werden.

Compilerbau Static-Single-Assignment-Form 212 LLVM Assemblersprache hauptsächlich als Zwischensprache für C- und C++-Compiler entwickelt enthält auch komplexere Datenstrukturen wie Arrays und Verbünde (structs), mit entsprechenden Zugriffsmethoden LLVM-Compiler führt Optimierungen darauf durch und generiert Code für verschiedene Zielarchitekturen z.b. x86, x86-64, PowerPC, ARM, Sparc, C,... Ziel: Modularisierung von wiederkehrenden Optimierungs- und Generierungsaufgaben Optimierungsphasen und Zielarchitekturen können flexibel hinzgefügt werden Compiler für neue Sprachen können sich auf das Front-End konzentrieren, wenn sie nach LLVM übersetzen www.llvm.org

Compilerbau Static-Single-Assignment-Form 213 LLVM Assemblercode In SSA-Form, stark getypt, beliebig viele Register define i32 @factorial(i32 %X) { entry: %0 = add i32 1, 0 %1 = icmp sgt i32 %X, 0 br i1 %1, label %rec_call, label %exit rec_call: %2 = sub i32 %X, 1 %3 = call i32 @factorial(i32 %2) %4 = mul i32 %X, %3 br label %exit exit: %5 = phi i32 [ %4, %rec_call ], [ %0, %entry ] ret i32 %5 }

Compilerbau Static-Single-Assignment-Form 214 LLVM im MiniJava-Compiler Aus Sicht unseres MiniJava-Compilers kann LLVM als weitere Zielarchitektur eingebettet werden, mit eigener Frame-Klasse, Code-Generierung, usw. Dazu muss vor oder während der Code-Generierung das Programm in SSA-Form umgewandelt werden. Außerdem muss die MiniJava-Zwischensprache um Typinformationen erweitert werden, weil diese im LLVM-Code zwingend benötigt wird. Alternativ kann man auch gleich in der Translate-Phase den abstrakten Syntaxbaum von Java in LLVM-Code übersetzen. Hierbei ist zu überlegen, welche LLVM-Sprachfeatures sich am besten für die Modellierung von Hochsprachen-Konstrukten (wie Objekten) anbieten.

Compilerbau Static-Single-Assignment-Form 215 LLVM im MiniJava-Compiler Möglichkeiten zur Erzeugung von LLVM-Code im Minijava-Compiler: 1 Implementierung des Verfahrens zur Erzeugung von SSA-Code: Generierung von LLVM-Code ohne φ-knoten, d.h. noch nicht in SSA-Form. Berechnung des Kontrollflussgraphen und des Dominanzbaums. Einfügen der φ-knoten an der Dominanzgrenze von Definitionen. Umbenennung der Variablen, so dass SSA-Code entsteht. 2 Simple SSA-Form durch stack-allokierte Variablen (LLVM hat einen Optimierungspass für solchen Code: mem2reg; in unseren Experimenten war das Ergebnis jedoch langsamer als der direkt erzeugte SSA-Code.)

Compilerbau Static-Single-Assignment-Form 216 Simple SSA-Form für LLVM Lege für jedes Temporary eine Speicherstelle an: % t = alloca i32 store i32 0, i32* % t %t = ptrtoint i32* % t to i32 Bei jedem lesenden Zugriff auf t wird der Inhalt der Speicherstelle in ein frisches Temporary gelesen: %t63 = inttoptr i32 %t to i32* %t64 = load i32* %t63 Bei jedem schreibenden Zugriff auf t wird der Inhalt der Speicherstelle überschrieben: %t65 = add i32 0, 0 %t66 = inttoptr i32 %t to i32* store i32 %t65, i32* %t66 Man erhält LLVM-Code in SSA-Form, da jede Variable (inklusive %t) nur einmal definiert wird.

Compilerbau Static-Single-Assignment-Form 217 Beispiel define i32 @LFac$ComputeFac(i32 %_t2, i32 %_t3) { // LABEL(L$$6) // MOVE(TEMP(t6), CONST(0)) // CJUMP(<, TEMP(t5), CONST(1), L$$1, L$$2) //... % t2 = alloca i32 store i32 %_t2, i32* % t2 %t2 = ptrtoint i32* % t2 to i32 % t3 = alloca i32 store i32 %_t3, i32* % t3 %t3 = ptrtoint i32* % t3 to i32 % t5 = alloca i32 %t5 = ptrtoint i32* % t5 to i32 br label %L$$6 L$$6: %t9 = add i32 0, 0 %t62 = inttoptr i32 %t5 to i32* store i32 %t9, i32* %t62 %t63 = inttoptr i32 %t3 to i32* %t21 = load i32* %t63 %t22 = add i32 1, 0 %t23 = icmp slt i32 %t21, %t22 br i1 %t23, label %L$$0, label %L$$1...

Compilerbau Static-Single-Assignment-Form 218 Simple SSA-Form für LLVM In einem MiniJava-Backend kann man mit folgenden Instruktionen auskommen: alloca, load, store, inttoptr, ptrtoint icmp, br call, ret add, sub, mul, sdiv, shl, shr, ashr, and, or, xor