目錄
(2)什麼是Reaching Definition Analysis?
(3)Reaching Definition Analysis有何用處?
(4)如何實現Reaching Definition Analysis?
(1)什麼是Reaching Definition?
假設變量v在程序點p處被定義(賦值),我們可以說,變量v在程序點p處的定義到達了程序點p',如果:
a. 程序點p和p'之間存在一條路徑;
b. 變量v在上述路徑中沒有被重新定義(賦值);
示意圖如下:
(2)什麼是Reaching Definition Analysis?
設p爲某程序點,v = E爲v的某定義語句:
RDA是,針對程序中的每個定義(p, v = E),分析出它可能到達的所有程序點(通常是一條指令的前後處)。
等價說法是,RDA是針對程序中的每個程序點(通常是一條指令的前後處),分析出可能到達此處的所有定義(p, v = E)。
可以看出,RDA屬於may分析,即RDA分析出的結果在程序實際執行時不一定會發生。
(3)Reaching Definition Analysis有何用處?
用處很多, 舉兩個例子來說明:
a. 死代碼去除。假設我們分析出變量v在程序點p處的定義(p, v)可能到達的程序點集合爲{},而在這些程序點對應的指令處,變量v並沒有被使用過,這表明定義(p, v)是無用代碼,可直接刪除以優化程序;
b. 內存泄漏檢查。假設動態內存分配指令對應的定義(p, v)可能到達的程序點集合爲{},當把這些程序點都檢查一遍後發現,指針v並沒有被free(delete)過,這表明內存發生了泄露。當然在實際研究中還要結合定義(p, v)到達各程序點的條件來分析,這裏只拿出最簡單的情況來說明。
(4)如何實現Reaching Definition Analysis?
數據流分析一般分forward分析和backward分析。forward分析即,按程序執行的方向來分析信息如何傳播;而backward分析則是按程序執行的反方向來分析信息的傳播。
對於Reaching Definition Analysis,我們要分析的信息是,針對每個程序點,可能到達此處的所有定義(p, v)。在分析之前,我們就知道一個事實,即在入口程序點(程序第一條指令之前)處,可達定義集合是空,因爲此時沒有一條定義出現過。而對於結束程序點(程序結束指令之後)處的可達定義集合,則需要分析。這就表明我們應該將入口程序點作爲RDA的起點。
此外,要確定某程序點的可達定義集合,必須先把入口程序點到此程序點的所有可能路徑上的定義都掃描一遍。這也表明RDA應採用forward分析。
爲了實現Reaching Definition Analysis,我們需要知道在RDA中,信息是如何傳播的。
- 信息通過指令時的傳播規則
首先,我們需要分析信息在通過一條指令後會發生什麼變化。
這裏我們舉例分析:
見上圖,在指令p處變量v被重新定義,因此變量v的舊定義(q3,v)無法到達程序點w1之後的所有程序點(包括w2),而其新定義(p,v)能到達的程序點至少存在一個,即w2。由於變量a和b未被重新定義,定義(q1,a)和(q2,b)可以順利傳遞到w2。
總結一下規則:
變量v的定義(新or舊定義)能到達指令p之後的緊鄰程序點q,如果:
a. 變量v在p處被重新定義(舊定義不可達,而新定義可達);
或者
b. 變量v在p之前的緊鄰程序點就已可達,且在p處未被重新定義(無新定義,因而舊定義可達)。
- 信息匯聚時的傳播規則
此外,還需要分析多條信息在某程序點匯聚時會發生什麼變化。
前面說過,RDA屬於may分析,即針對每個程序點,一旦某定義可能到達此處,那麼此定義就要加入到此程序點的可達定義集合中。因此當來自不同分支的可達定義集合在某程序點發生匯聚時,此程序點處的可達定義集合應是各集合的並集。
- 信息傳播規則的形式化表述
綜上,對於RDA,在附近的信息傳播規則如下:
其中IN(p)是指令p之前的緊鄰程序點處的可達定義集合,OUT(p)是指令p之後的緊鄰程序點處的可達定義集合,pred(p)是指令p的前驅指令,defs(v)是以v爲變量的定義,定義的形式是(指令,變量)。
我們也能從傳播規則看出RDA屬於forward分析,因爲OUT(p)由IN(p)運算得來。
爲什麼是而不是?
前者是先把變量v的舊定義去掉,再加入v的新定義,符合RDA的信息傳播規則——若存在v的新定義,則v的舊定義不可達而新定義可達。後者先加入v的新定義,接着把v的所有定義都去掉,這顯然有問題。
- 基於信息傳播規則,求解可達定義集合
未完待續