Efficient Alias Set Analysis Using SSA Form Proseminar Programmanalyse WS 11/12 André Hunke
Ziele Alias Sets SSA Form Verwendete Datenstruktur Benchmark-Ergebnisse Efficient Alias Set Analysis Using SSA Form Übersicht
Alias Sets werden vom Compiler genutzt Effiziente Alias Set Analyse – nur intra-prozedual – hierfür: Nutzung der SSA-Form Nutzung einer geeigneten Datenstruktur Efficient Alias Set Analysis Using SSA Form Ziele
Menge der lokalen Pointer-Variablen, die auf ein gemeinsames Objekt zeigen Zu einem gegebenen konkreten Objekt o: o # = { p | p zeigt auf o} Jedes alias set repräsentiert höchstens ein Objekt ρ # : Menge aller alias sets falls für Variablen x, y: {x,y} o #, so ist x ein Alias von y Sichere Entscheidung, falls x und y immer gemeinsam in einem o #, oder nie gemeinsam in einem o # Efficient Alias Set Analysis Using SSA Form Alias Sets
betrachten Zuweisungen s der Form s ::= v 1 v 2 | v e | e v | v null | v new wobei v, v 1, v 2 lokale Variablen sind und e eine Position auf dem Heap repräsentiert Heap wird als Black-Box behandelt Efficient Alias Set Analysis Using SSA Form Alias Sets
Bei Unsicherheit, ob ein alias set eine Variable enthält, wird es aufgeteilt Efficient Alias Set Analysis Using SSA Form Alias Sets - Übergangsfunktion
class Node { int value; Node next; Node (int v, Node n) { value = v; next = n; } Efficient Alias Set Analysis Using SSA Form Alias Sets - Beispiel
… void foo(int i) { Node a, b, c; a = new Node(i, null); c = a; if (i < 42) b = new Node(42+i, a); else b = a; c = b; b = b.next; } … Efficient Alias Set Analysis Using SSA Form Alias Sets - Beispiel a = new Node(i, null); b = new Node(42+i,a); c = b; b = a; b = b.next; Kontrollflussgraph c = a;
Efficient Alias Set Analysis Using SSA Form Alias Sets – Beispiel ρ # = {{a}} ρ # = {{a,c},{b}} ρ # = {{a,b,c}} ρ # = {{a}, {a,b}, {c}, {b,c}, {a,c}, {a,b,c}} a = new Node(i, null); b = new Node(42+i,a); c = b; b = a; b = b.next; c = a; ρ # = {{a,c}} ρ # = {{a}, {b,c}, {a,b,c}}
SSA = Single Static Assignment pro Variable höchstens eine Zuweisung – Jede Zuweisung erzeugt eine neue Variable Transformation in SSA form Efficient Alias Set Analysis Using SSA Form SSA Form
Efficient Alias Set Analysis Using SSA Form SSA Form - Beispiel Lösung? a = new Node(i, null); b = new Node(42+i,a); c = b; b = a; b = b.next; c = a; a1 = new Node(i, null); b1 = new Node(42+i,a1); c2 = b?; b2 = a1; b? = b?.next; c1 = a1;
Problem: Zuweisungen mit mehr als einer reaching definition Lösung: φ-Funktion einfügen – wählt den Wert des tatsächlich genommenen Kontrollflusses – Zuweisung dann an eine neue Variable Hier: φ-Funktion an jedem Merge-Knoten Efficient Alias Set Analysis Using SSA Form SSA Form
Efficient Alias Set Analysis Using SSA Form SSA Form - Beispiel a = new Node(i, null); b = new Node(42+i,a); c = b; b = a; b = b.next; c = a; a1 = new Node(i, null); b1 = new Node(42+i,a1); b3 = φ(b1,b2) c2 = b3; b2 = a1; b4 = b3.next; c1 = a1;
Erweiterung der Übergangsfunktion für Knoten mit φ-Funktion nötig Strategie: – für jede Eingehende Kante p: – aktualisiere die Alias-Sets entsprechend der Auswahl der φ-Funktion für p Efficient Alias Set Analysis Using SSA Form Alias Sets & SSA Form
Efficient Alias Set Analysis Using SSA Form Alias Sets & SSA Form a1 = new Node(i, null); b1 = new Node(42+i,a1); b3 = φ(b1,b2) c2 = b3; b2 = a1; b4 = b3.next; c1 = a1; ρ # = {{a1}} ρ # ={{a1,c1}} ρ # = {{a1,c1},{b1}}ρ # = {{a1,c1,b2}} ρ # = {{a1,c1}, {b1,b3,c2}} {{a1,c1,b2,b3,c2}} ρ # = {{a1,c1}, {a1,c1,b4}, {b1,b3,c2}, {b1,b3,c2,b4}, {a1,c1,b2,b3,c2}, {a1,c1,b2,b3,c2,b4}}
Beobachtung: Für nicht φ-Knoten ist die Mengendifferenz in der Übergangsfunktion überflüssig Weitere Analyse für φ-Knoten nötig Efficient Alias Set Analysis Using SSA Form Alias Sets & SSA Form
es können lineare Listen verwendet werden eine Liste repräsentiert ein alias set neues Element hinzufügen: neuer Listenkopf – Restliste bleibt unverändert Element entfernen: nicht nötig! gemeinsame Nutzung von Restlisten möglich Efficient Alias Set Analysis Using SSA Form Datenstruktur ecdba gf drei alias sets: {d,e}, {a,b,c,d,e},{d,e,f,g} Beachte: Für φ-Knoten gibt es eine andere Übergangsfunktion, d.h. es ist eine andere Listenoperation nötig
Efficient Alias Set Analysis Using SSA Form Alias Set-Analyse mit Listen a1 = new Node(i, null); b1 = new Node(42+i,a1); b3 = φ(b1,b2) c2 = b3; b2 = a1; b4 = b3.next; c1 = a1; a1 b2 c1 a1c1 b1 a1b2c1b3c2 b1b3c2 a1b2c1b3c2 b1b3c2 b4
Laufzeit: Im Schnitt etwa doppelt so schnell Efficient Alias Set Analysis Using SSA Form Benchmark-Ergebnisse
Speicherverbrauch (nur Alias-Analyse): Im Schnitt etwa 45% weniger Speicher etwa 7% zusätzlicher Speicherverbrauch für SSA-Form Efficient Alias Set Analysis Using SSA Form Benchmark-Ergebnisse
Efficient Alias Set Analysis Using SSA Form Vielen Dank für die Aufmerksamkeit Noch Fragen?