690 likes | 873 Views
Code-Erzeugung. Arne Kostulski ( arne@kostulski.net ). 1. Abgrenzung, Motivation, Einordnung 2. Grundlagen 3. Code-Repräsentation 4. Code-Erzeugung 5. Fazit und weiterführende Themen.
E N D
Code-Erzeugung Arne Kostulski ( arne@kostulski.net )
1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen
1. Abgrenzung, Motivation, Einordnung2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung5. Fazit und weiterführende Themen
Abgrenzung und Motivation Effizienz durch Automatisierung
1. Abgrenzung, Motivation, Einordnung2. Grundlagen* Zielgrößen * Entwurfsfaktoren * Kernaufgaben * Referenzmaschine3. Code-Repräsentation4. Code-Erzeugung 5. Fazit und weiterführende Themen
Zielgrößen • Semantische Korrektheit • Laufzeiteffizienz • Virtuelle Speichernutzung • Physische Speichernutzung • Kompilierzeit Heuristiken für komplexe Optimierungsprobleme konträr
Registerverwendung • Aufgaben • Registerzuteilung • Registerauswahl • Ziel • Totale Lade- und Speicherzeiten minimieren
Instruktionsselektion • Aufgabe • Auswahl von Instruktionskombination • Ziel • Minimiere totale Instruktionskosten! • Beispiel • Zwischencode:a := a + 1 • Zielcode: 1 2 1 1 1 1 LD R, a INC a ST a, R ∑ 4 ∑ 3
Instruktionsanordnung • Aufgabe • Befehlsfolgen reorganisieren • Ziele • Code-Vereinfachung • Bessere Registerausnutzung • Parallelisierung unabhängiger Befehle
Kernaufgaben und ISA InstructionSet Architecture (ISA) • ComplexInstruction Set Computer (CISC) • ReducedSet Computer (RISC) • VeryLong Instruction Word (VLIW)
Abstrakte Zielmaschine - Zielsprache • Notation für Operationen: Bsp.: MUL R3, R1, R2 OP <destination>, <source>, <source>, mit <destination> = Ri | { Kleinbuchstabe } <source> = Ri | { Kleinbuchstabe } | „#“ { Ziffer } OP = ADD | SUB | MUL | DIV • Ausnahmen: LD R, x ST x, R
Abstrakte Zielmaschine Definition • Zielsprache • Universalregister: R1, …,Rn • Administrative Register separat • Adressierungen
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen3. Code-Repräsentation * Basisblöcke * Flussgraphen * DAG4. Code-Erzeugung 5. Fazit und weiterführende Themen
Code-Repräsentation: Basisblöcke • Strukturierung des Zwischencodes • Kontrollfluss • Variablenverwendung • Basisblock • Minimale Sequenz von Instruktionen • Blockanfänge definiert durch: • Die erste Instruktion des Zwischencodes. • Jede direkte Nachfolge-Instruktion eines Sprunges. • Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.
Code-Repräsentation: Basisblöcke Beispiel a) Die erste Instruktion des Zwischencodes.
Code-Repräsentation: Basisblöcke Beispiel a) Die erste Instruktion des Zwischencodes.
Code-Repräsentation: Basisblöcke Beispiel b) Jede direkte Nachfolge-Instruktion eines Sprunges.
Code-Repräsentation: Basisblöcke Beispiel b) Jede direkte Nachfolge-Instruktion eines Sprunges.
Code-Repräsentation: Basisblöcke Beispiel c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.
Code-Repräsentation: Basisblöcke Beispiel c) Jede Zielinstruktion eines (bedingen oder unbedingten) Sprungbefehls.
Code-Repräsentation: Basisblöcke Ergebnis
Code-Repräsentation: Flussgraphen Flussgraph • gerichteter, zyklischer Graph G=(V,E) mit • Knotenmenge V: Menge aller Basisblöcke (Block als Blackbox) • Kantenmenge E: e(Bi, Bj) Є E genau dann, wenn: • Bj folgt direkt auf Bi in der Programmfolge und Biohne unbedingten Sprung. • Bj ist Ziel eines Sprungbefehls.
Code-Repräsentation: Flussgraphen • Beispiel: a) Bj folgt direkt auf Bi in der Programmfolge und Bi enthält keinen unbedingten Sprung.
Code-Repräsentation: Flussgraphen • Beispiel: b) Bj ist Ziel eines Sprungbefehls.
Code-Repräsentation: Blockoptimierung mit DAG • Innendarstellung eines Blocks • gerichteter, azyklischer Graph (DAG) • Ziele • Registerausnutzung verbessern • Code-Vereinfachung • Toten Code eliminieren • Elemente Operation Label Initiale Variable
Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion • a := b * c • c := a + d • b := a * b • Erzeuge • - Blatt / Blätter • Operationssymbol • Kanten • Label
Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion • a := b * c • c := a + d • b := a * b • Erzeuge • - Blatt / Blätter • Operationssymbol • Kanten • Label
Code-Repräsentation: Blockoptimierung mit DAG DAG-Konstruktion • a := b * c • c := a + d • b := a * b • Erzeuge • - Blatt / Blätter • Operationssymbol • Kanten • Label
Code-Repräsentation: Blockoptimierung mit DAG Code-Vereinfachung a := b * c c := a + d b := a * b d := a + d a := b * c c := a + d b := a * b d := c , d • Erzeuge • - Blätter • Operationssymbol • Kanten • Label
Code-Repräsentation: Blockoptimierung mit DAG Lebendigkeit von Variablen • Eine Variable x ist lebendigin Anweisung Ai(1 ≤ i < n),wenn: • x in Anweisung A1 ein Wert zugewiesen wird, • x in Anweisung An als Operand benutzt bzw. gelesen wird, • x zwischen A1 und An kein Wert zugewiesen wird. • x hat bei Ai die nächste Verwendung in An, wenn An der erste Lesezugriff auf x nach A1ist. • Eine am Basisblockende lebendige Variable heißt live on exit.
Code-Repräsentation: Blockoptimierung mit DAG • Toter Code • Instruktionen mit nicht benötigten Ergebnissen • Beispiel • c, d nicht live on exit
1. Abgrenzung, Motivation, Einordnung 2. Grundlagen3. Code-Repräsentation4. Code-Erzeugung * Elementare Code-Erzeugung * Globale Registerzuteilung * Optimale Code-Erzeugung * Peephole-Optimierung5. Fazit und weiterführende Themen
Elementare Code-Erzeugung • Register-Deskriptor • Zuordnungen: Register Variablennamen • Adressen-Deskriptor • Zuordnungen: Variablen Speicheradresse • Annahmen für Zielmaschine • LD und ST explizit • keine globalen Register • Variablen mit nächster Verwendung am Blockanfang zu laden • live on exit-Variablen zu speichern
Elementare Code-Erzeugung • Hilfsfunktion getReg • getReg(B) mit Drei-Adress-Befehl B • Für a := b OP c • Lade nötige Variablen • Führe den Befehl OP Ra, Rb, Rcaus. • Fallunterscheidungen für Code-Erzeugung • LD R, a • ST a, R • a := b OP c • a := b
Elementare Code-Erzeugung Beispiel: a := b * c
Elementare Code-Erzeugung • a := b OP c • (mit den Registern Ra, Rb, Rc) • 4.1 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus. • […] • LD R, a • 1.1 Der Inhalt von R im Register-Deskriptor ist durch a zu ersetzen • 1.2 Füge im Adress-Deskriptor R zu a hinzu.
Elementare Code-Erzeugung • 4. a := b OP c (mit den Registern Ra, Rb, Rc) • 4.1 Falls b bzw. c nicht im Register, führe LD Rb, b bzw. LD Rc, c aus. • 4.2 Der Inhalt von Ra im Register-Deskriptor ist durch a zu ersetzen. • 4.3 Der Inhalt von a im Adress-Deskriptor ist durch Ra zu ersetzen. • 4.4 Entferne Ra von allen anderen Variablen im Adress-Deskriptor.
Elementare Code-Erzeugung • ST a, R • Der Inhalt von a im Adress-Deskriptor ist durch R zu ersetzen.
Globale Register • Problem • VieleHauptspeicherzugriffe • ST a, R1 • LD R1, a • Lösung • ST a, R1 • LD R1, a • Problem • ST a, R1 • if … then goto … • LD R1, a
Globale Register • Beispiel • Betrachte Variable b • Lesezugriff • LD R, a
Globale Register • Beispiel • Betrachte Variable b • Lesezugriff • LD R, a • Schreibzugriff • live on exit • Lösung • RegisterinhalteüberdauernBasisblöcke • Registerzuteilung? • Bewertung:
Graphfärbung • Problem • Register voll • Registerauswahl? • Lebensspanne für ideelle Register • Hier: Graph 2-fach färbbar • Kollisionen unvermeidbar Zwischenspeicherung
Instruktionsselektion • Idee: Alternative Instruktionskombinationen
Optimale Code-Erzeugung • Ziel • Code mit minimaler Registeranzahl • Berücksichtigt • Registerzuteilung • Registerauswahl • Instruktionsanordnung • Basis • DirectedAcyclic Graph (DAG) • Procedere: • Annotiere Ershov-Nummern an Graph-Knoten • Führe Generierungsalgorithmus aus