DataFlow Analysis cheatsheet
Frameworks
Type of framework | equations |
---|---|
Forward | in[b] = \(\land\) out[preds] |
out[b] = Gen(b) \(\cup\) (in[b] - kill[b]) |
Type of framework | equations |
---|---|
Backwards | out[b] = \(\land\) in[succ] |
in[b] = Gen(b) \(\cup\) (out[b] - kill[b]) |
1 Reaching definitions
Idea
Una definizione \(D\) raggiunge un punto \(P\) se esiste un percorso da \(D\) a \(P\) tale per cui \(D\) non è uccisa (sovrascritta). In forma SSA, la reaching definition di un'istruzione è l'istruzione stessa, semplicemente rappresentata in un'altro modo.
Implementazione
Analysis | Reaching Definitions |
---|---|
Dominio | Definizioni |
Direzione | Forward |
Gen | Definizioni localmente disponibili |
Kill | Definizioni i cui LHS sono gli stessi LHS delle definizioni nel BB |
Meet Operator | \(\cup\) |
- Definizione localmente disponibile: ultima definizione di una variabile all'interno di un BB.
2 Available Expressions
Idea
Un'espressione \(x \otimes y\) è available in un punto \(P\) se viene valutata in ogni percorso che da entry porta a P. Quando durante il flow di un programma viene richiesta della computazione per calcolare un valore, ci si chiede se quella particolare espressione è già stata calcolata in passato (con gli stessi operandi ovviamente). In tal caso, si possono evitare calcoli ridondanti.
Implementazione
Analysis | Available Expressions |
---|---|
Dominio | Espressioni |
Direzione | Forward |
Gen | espressioni del tipo \(x \otimes y\) se non vengono riassegnati gli operandi |
Kill | un blocco uccide \(x \otimes y\) se riassegna \(x\) o \(y\) e non ricalcola \(x \otimes y\) |
Meet Operator | \(\cap\) |
3 Live Variables
Idea
Una variabile \(V\) è alive in un punto \(P\) se esiste almeno un percorso che da \(P\) porta a exit che usa il valore di quella variabile. (La variabile stessa se si considera la forma SSA). Altrimenti la variabile viene definita dead.
Implementazione
Analysis | Live Variables |
---|---|
Dominio | Variables |
Direzione | Backwards |
Gen | Operandi(RHS) delle espressioni |
Kill | Destinazioni(LHS) delle espressioni |
Meet Operator | \(\cup\) |
4 Dominator Analysis
Idea
Un blocco \(B\) domina un blocco \(A\) se partendo da entry per arrivare ad \(A\) si passa necessariamente per \(B\).
Implementazione
Analysis | Dominator Analysis |
---|---|
Dominio | Blocks |
Direzione | Forward |
Gen | Gen[bb] = bb |
Kill | \(\emptyset\) |
Meet Operator | \(\cap\) |
5 Very Busy Expressions
Idea
Una espressione \(E\) è very busy in un punto \(P\) se \(E\) viene valutata in ogni percorso a partire da \(P\) prima che uno dei suoi operandi venga ridefinito. Il concetto è che se un'espressione è very busy in un certo punto \(P\), nel caso in cui ci siano più punti in cui essa viene valutata, si possono "accorpare" le varie valutazioni dell'espressione in una unica nel punto \(P\). Questo passo potrebbe essere propedeutico per la realizzazione di ulteriori ottimizzazioni.
Implementazione
Analysis | Very Busy Expressions |
---|---|
Dominio | Espressioni |
Direzione | Backwards |
Gen | \(x \otimes y\) se \(x \otimes y\) viene valutata prima che \(x\) o \(y\) siano ri-definiti |
Kill | Espressioni i cui operandi sono ri-definiti all'interno del BB |
Meet Opereator | \(\cap\) |