Compilerbau/Kapitel 6: Lebendigkeitsanalyse
Aus Halloserv Wiki
Dieses Kaptiel wird in Codeerzeugung integriert und bald gelöscht - verwenden sie statt dessen 5. Codeerzeugung !
(Appd, Kapitel 10)
Inhaltsverzeichnis |
Zustand des übersetzten Programs
- Folge von Instruktionen über Pseudoregister
- Annahme: Mschine mit unendlich vielen Registern
- Reale Maschine: endlich viele Register
Gesucht: Abbildung Pseudoregister
reale Register, sodass 2 unterschiedliche Pseudoregister nur dann auf ein reales Register abgebildet werden, wenn sie nicht gleichzeitig benutzt werden.
- Lebendigkeit formuliert diese Eigenschaft
- Analyse der Lebendigkeit ist ein Beispiel für statische und semantische Analyse.
Die Analyse wird auf einem Kontrollflußgraphen (KFG) durchgeführt:
|
unleserlich-Stücke:
|
|
|
Kontrollflußgraphen
Definition
Ein Kontrollflußgraph ist ein markierter gerichteter Graph. Die Markierungen sind entry, exit, return c, a relop b, a: = e. Jede Instruktion liefert einen Knoten.
Kanten
| Markierung | eingehende Kanten | ausgehende Kanten |
|---|---|---|
| entry | 0 | 1 |
| exit | N | 0 |
| return | N | 0 |
| a relop b | N | 2 |
| a:=e | N | 1 |
Über die eingehende Kanten werden mit succ(n) die Nachfolgerknoten erreicht; über die ausgehenden Kanten erhält man mit pred(n) die Vorgängerknoten.
Verhalten bei Konstruktion
- use[n]: Menge der Pseudoregister die von Knoten n verwendet werden.
- def[n]: Pseudoregister die von Knoten n definiert (und überschrieben) werden.
| Instruktion | use[n] | def[n] |
|---|---|---|
| return c | {c} |
|
| a relop b | {a,b} |
|
| a:=e | Regs(e) | {a} |
Lebendigkeit
Definition
Ein Pseudoregister r ist auf einer Kante des Kontrollflußgraphen lebendig falls es einen Pfad zu einem n mit
gibt auf dem kein Knoten n' mit
liegt.
-
, falls r lebendig auf einer eingehenden Kante zu n ist
-
, falls r auf einer ausgehenden Kante lebendig ist
Daraus ergeben sich die Datenflussgleichungen für die Lebendigkeit:
![live\mbox{-}in[n]=Use[n] \cap live\mbox{-}out[n] \setminus Def[n]](/wiki/upload/math/f/4/a/f4ab927ad1b533e6482485aceb119165.png)
![live\mbox{-}out[n]=\bigcup_{n' \in Succ(n)} live\mbox{-}in[n']](/wiki/upload/math/7/0/b/70bb94e1eca45cd6a56634bfe09f3452.png)
Die Lösung der Gleichungen erhalten wir durch Fixpunktiteration
Für die Rückwärtsanalyse müssen wir einfach die Zeilen 8 und 9 vertauschen.
Beispiel
Diese Beispiele sind nicht korrekt! Sie müssen nachgerechnet werden. Hier steht teilweise b anstelle von δ ! Firefox 23:24, 4. Sep. 2007 (CEST)
| 1 | 2 | 3 | |||||
|---|---|---|---|---|---|---|---|
| in | out | in | out | in | out | ... | |
| 1 | | | | a | | a | ... |
| 2 | a | | a | c,b | a,c | c,b | ... |
| 3 | c,b | | c,b | b | c,b | b | ... |
| 4 | b | | b | a | b | a | ... |
| 5 | a | a | a | c,a | a,c | c,a | ... |
| 6 | c | | c | | c | | ... |
Rückwärtsanalyse: Information wird gegen den Kontrollflußgraph propagiert.
| 1 | 2 | ||||
|---|---|---|---|---|---|
| 1 | a | a,c | c | a,c | ... |
| 2 | a,c | c,δ | a,c | δ,c | ... |
| 3 | c,δ | δ,c | δ,c | δ,c | ... |
| 4 | b,c | a,c | b,c | a,c | ... |
| 5 | a,c | c | a,c | a,c | ... |
| 6 | c | | c | | ... |
Diese Beispiele sind nicht korrekt! Sie müssen nachgerechnet werden. Hier steht teilweise b anstelle von δ ! Eine Tabelle ist wegen Ansichttest doppelt ! Firefox 23:45, 4. Sep. 2007 (CEST)
Komplexität
Hier fehlen zusätzliche Erklärungen. Fraglich was diese Tabelle zu bedeuten hat... Firefox 23:24, 4. Sep. 2007 (CEST)
Grundoperationen
Mengenrepräsentation
| Bitvektor | geordnete Liste (ohne Wiederholungen) | |
|---|---|---|
| Platz | | N |
| Kopie | O(N) | O(N) |
| Bitweise oder O(N) | O(N) |
| and/neg O(N) | O(N) |
Interferenzgraph
Der Interferenzgraph (IG) ist ein ungerichteter Graph mit
- Knoten : = Menge der Pseudoregister
- Kantenmenge E, sodass für
gilt
- falls m keine MOVE-Konstruktion ist, dann
- falls m ist t: = r gilt (MOVE-Konstruktion), dann
- falls m keine MOVE-Konstruktion ist, dann
Bemerkung: Weitere Constraints können durch den Interferenzgraph ausgedrückt werden:
- falls
eine Konstruktion ist, deren Ergebnis nicht im Register z erzeugt werden kann, dann
- verwende Pseudoregister dem z direkt zugeordnet ist
-
- Caller-Save-Register werden als Def[Call-Intr.en] betrachtet (unleserlich)
Interferenz zwischen den Caller-Save-Registern und den lebendigen Registern
Lebendige Register
Caller-Save-Register oder Speicher
Registerallokation
Zurückführung auf Graphfärbung des Interferenzgraphen.
Farbe
Maschinenregister
Färbung ist Abbildung von Knoten(IG) auf Menge der Farben, sodass benachbarte Knoten unterschiedliche Farben erhalten
K Maschinenregister
K-Färbung gesucht.
Probleme:
- K-Färbung zu finden ist NP-Vollständig.
- falls eine K-Färbung nicht möglich ist müssen Pseudoregister im Speicher abgelegt werden. (Spillung)
Sei G = (V,E) ungerichtet und
mit Grad(V) < K. Falls
eine K-Färbung F' besitzt, dann exisitiert F mit F ist K-Färbung von G.
Seien 

, also ist
K-Färbung von G.
