數據流分析之Liveness Analysis

目錄

 

(1)什麼是Liveness?

(2)什麼是Liveness Analysis?

(3)Liveness Analysis有何用處?

 (4)如何實現Liveness Analysis?

- 信息在通過指令時的傳播規則

 - 信息在匯聚時的傳播規則

- 信息傳播規則的形式化表述

- 基於信息傳播規則,求解活躍變量集合


(1)什麼是Liveness?

我們說,變量v在程序點p處是活躍的,如果:

a. 變量v在程序點p'處被使用,且程序點p和p'之間存在一條路徑;

b. 變量v在上述路徑中沒有被定義過;

示意圖如下:

(2)什麼是Liveness Analysis?

LA是針對程序中的每個程序點(通常是一條指令的前後處),分析出活躍於此處的所有變量。

    從 Liveness的定義可看出,LA分析出的活躍變量在程序執行過程中不一定是活躍的,原因在於LA分析中程序點p和p'之間可能存在多條路徑,假設變量v在其中一條路徑中未被定義過,而在另一條路徑中被定義過,那麼依據 Liveness的定義,變量v在p處仍是活躍的。但在程序實際執行過程中,被執行的從p到p'的路徑,可能恰好是變量v被定義過的那一條,那麼此時變量v是非活躍的。 由此可以看出,LA屬於may分析。

(3)Liveness Analysis有何用處?

舉兩個例子來說明

a. 死代碼去除。針對每個程序點處的活躍變量集合和程序中出現的每個變量,若某變量v在某程序點之前被賦值過,但v又不在此程序點的活躍變量集合中,這就說明賦予v的值沒有被使用過,故此賦值語句沒有任何意義,可直接刪除以優化程序;

b. 優化寄存器分配。當進行運算時,運算所需的變量需要從內存讀取到寄存器中。如果此時所有寄存器已被裝滿,那麼需要將部分變量從寄存器中取出,並存回內存中。將哪些變量從寄存器中取出,而哪些變量可以繼續存放在寄存器中這個問題,可利用活躍變量集合來回答。首先獲取此運算所位於的程序點處的活躍變量集合,假設一寄存器中存有變量v,另一寄存器中存有變量w,而w在此活躍變量集合中,v不在,那麼優先將v從寄存器中取出,保證後續還會很快用到的變量w繼續存放於寄存器中。

 (4)如何實現Liveness Analysis?

    與Reaching Definition Analysis不同,在LA分析之前,我們就知道結束程序點(可能有多個)處的活躍變量集合是空,因爲沒有任何變量在此後被使用過。而入口程序點處的活躍變量集合則需要分析。因此應以結束程序點作爲分析的起點。

    此外,要確定某程序點處的活躍變量集合,必須先把此程序點到所有結束程序點的所有可能路徑上的指令都掃描一遍。這也表明LA應採用backward分析。

 與Reaching Definition Analysis一樣,爲了實現Liveness Analysis,我們需要知道在LA中,信息是如何傳播的。

- 信息在通過指令時的傳播規則

首先,分析信息在通過一條指令後會發生什麼變化。

我們舉例分析:

從上圖可以看到,我們分析的方向與程序執行方向相反。在指令p處變量v被重新賦值,因此v在程序點w2處本應不再活躍。但同時v在p處被使用過,因此v在w2處仍活躍。變量b在p處被使用,因此b活躍於w2處。由於未被重新賦值,活躍變量c可以順利傳遞到w2。

總結一下規則:

變量v活躍於指令p之前的緊鄰程序點q,如果:

a. 變量v在p處被使用(新鮮的活躍變量);

或者

b. 變量v在p之後的緊鄰程序點就是活躍的,且在p處未被重新賦值(舊的活躍變量得以順利傳遞);

 - 信息在匯聚時的傳播規則

其次,分析多條信息在某程序點匯聚時會發生什麼變化。

與Reaching Definition Analysis一樣,LA屬於may分析,即在程序點p往後延伸出的所有路徑中,只要存在一條路徑,變量v在其上被使用過且使用之前未被重新賦值過,那麼v在p處就是活躍的。因此當來自不同分支的活躍變量集合在某程序點發生匯聚時,此程序點處的活躍變量集合應是各集合的並集。

- 信息傳播規則的形式化表述

因此,對於LA,其在\large p:v = E附近的傳播規則如下:

OUT(p)=\cup IN(p_s),p_s \in succ(p) \\ IN(p)=(OUT(p)-\{v\}}) \cup vars(E)

    其中IN(p)是指令p之前的緊鄰程序點處的活躍變量集合,OUT(p)是指令p之後的緊鄰程序點處的活躍變量集合,succ(p)是指令p的後繼指令,vars(E)是表達式E中所使用的變量。

我們也能從傳播規則看出LA屬於backward分析,因爲IN(p)由OUT(p)運算得來。 

爲什麼是IN(p)=(OUT(p)-\{v\}}) \cup vars(E)而不是IN(p)=(OUT(p)\cup vars(E)) -\{v\}}

 前者先把被重新賦值過的變量從活躍變量集合中去掉,再加入剛被使用過的變量,這能正確處理諸如v = v + b,這種對於同一變量既存在賦值操作也存在使用操作的指令。而後者則無法正確處理。

- 基於信息傳播規則,求解活躍變量集合

未完待續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章