Praktikum Compilerbau Sitzung 7 libfirm Lehrstuhl für Programmierparadigmen Universität Karlsruhe (TH) 3. Juni 29 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 / 2
Letzte Woche 2 Firmgraph Optimierungen 3 Aufgabe 4 Sonstiges (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 2 / 2
Letzte Woche Letzte Woche Was waren die Probleme? Hat soweit alles geklappt? (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 3 / 2
Firmgraph Optimierungen Letzte Woche 2 Firmgraph Optimierungen 3 Aufgabe 4 Sonstiges (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 4 / 2
Firmgraph Optimierungen Compilerphasen Lexer Parser Tokens AST Semantik Zwischencodeerzeugung Optimierung attributierter AST Zwischencode Zwischencode Codeerzeugung (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 5 / 2
Firmgraph Optimierungen Optimieren mit Firm Ersetzen von teueren Strukturen durch Billigere Entfernen unnötiger Befehle Gemeinsame Teilausdrücke Konstantenfalten Arithmetische Vereinfachung... Graphbasierter Zwischencode Ablaufen des Graphen SSA Form Def-Use enthalten Viele Optimierungen gehen einfacher (ohne Datenfluss Analyse) Tipp: Normalisieren als erster Schritt hilft oft (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 6 / 2
Firmgraph Optimierungen Beispiel: Konstantenfalten public int foo3() { int x; x = 2 + 3; return x + x + 4; Konstante Ausdrücke vorberechnen Variablen mit Konstanten Werten propagieren In Firm sehr einfach: keine Variablen vorhanden public int foo3() { return 4; (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 7 / 2
Firmgraph Optimierungen Beispiel: Firmgraph foo3()i Block 46 public int foo3() { int x; x = 2 + 3; return x + x + 4; Start 49 ProjM 54 ProjX X_initial_exec 5 Block 56 ConstIs x3 59 ConstIs x2 58 AddIs 6 AddIs 6 ConstIs x4 62 AddIs 63 Return 65 Block 44 End 45 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 8 / 2
Firmgraph Optimierungen Beispiel: Firm Konstantenfalten Block 56 Graph durchlaufen und konstante Ausdrücke suchen Wie durchlaufen? Tiefensuche, Breitensuche, Postorder,...? ConstIs x3 59 ConstIs x2 58 AddIs 6 AddIs 6 ConstIs x4 62 AddIs 63 Return 65 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 9 / 2
Firmgraph Optimierungen Tiefensuche void preorder(node node) { act(node); for (Node pred : node.predcessors) { preorder(pred); void postorder(node node) { for (Node pred : node.predcessors) { postorder(pred); act(node); (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 / 2
Firmgraph Optimierungen Beispiel: Tiefensuche Block 56 ConstIs x3 59 ConstIs x2 58 AddIs 6 AddIs 6 ConstIs x4 62 AddIs 63 Return 65 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 / 2
Firmgraph Optimierungen Start 49 Beispiel: Tiefensuche ProjM 54 ProjX X_initial_exec 5 ConstIs x3 59 ConstIs x2 58 Block 56 Preorder Block 56 AddIs 6 ConstIs x5 67 AddIs 6 ConstIs x4 62 AddIs 6 ConstIs x4 62 AddIs 63 Return 65 AddIs 63 Return 65 Block 44 End 45 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 / 2
Firmgraph Optimierungen Beispiel: Tiefensuche Block 56 ConstIs x3 59 ConstIs x2 58 AddIs 6 AddIs 6 ConstIs x4 62 AddIs 63 Return 65 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 2 / 2
Firmgraph Optimierungen Beispiel: Tiefensuche Start 49 Block 46 ConstIs x3 59 ConstIs x2 58 Block 56 ProjM 54 ProjX X_initial_exec 5 AddIs 6 AddIs 6 ConstIs x4 62 Postorder Block 56 ConstIs xe 69 AddIs 63 Return 65 Return 65 Block 44 End 45 (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 2 / 2
Firmgraph Optimierungen Graph traversieren in Firm Preorder Tiefensuche im Firmgraph: walk(nodevisitor visitor) Postorder Tiefensuche im Firmgraph: walkpostorder(nodevisitor visitor) public interface NodeVisitor { void visit(nomem node); void visit(end node);... static abstract class Default implements NodeVisitor { public abstract void defaultvisit(node n); public void visit(nomem node) { defaultvisit(node); (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 3 / 2
Firmgraph Optimierungen Beispiel: Konstantenfalten - Initialisierung public class FoldConstants extends NodeVisitor.Default { private final Graph graph; public FoldConstants(Graph method) { this.graph = method; public void optimize() { graph.walkpostorder(this); //graph.walk(this); public void defaultvisit(node n) { // Leave nodes untouched per default. (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 4 / 2
Firmgraph Optimierungen Beispiel: Konstantenfalten - Add public void visit(add add) { Node left = add.getleft(); Node right = add.getright(); if (left instanceof Const && right instanceof Const) { Const c = (Const) left; Const c2 = (Const) right; TargetValue val = c.gettarval(); TargetValue val2 = c2.gettarval(); TargetValue valsum = val.add(val2); Node sum = graph.newconst(valsum); Graph.exchange(add, sum); (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 5 / 2
Firmgraph Optimierungen Demo Demo (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 6 / 2
Aufgabe Letzte Woche 2 Firmgraph Optimierungen 3 Aufgabe 4 Sonstiges (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 7 / 2
Aufgabe Optimierungen Implementiere Konstantenfaltung. Entwirf eine sinnvolle Normalisierung und begründe sie. Implementiere die Normalisierung. (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 8 / 2
Sonstiges Letzte Woche 2 Firmgraph Optimierungen 3 Aufgabe 4 Sonstiges (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 9 / 2
Sonstiges Feedback! Fragen? Probleme? Anmerkungen? Probleme? Fragen? (IPD Snelting) Sitzung 7 libfirm 3. Juni 29 2 / 2