資料流分析之Liveness Analysis

2021-10-23 05:01:58 字數 2487 閱讀 5994

目錄

(1)什麼是liveness?

(2)什麼是liveness analysis?

(3)liveness analysis有何用處?

(4)如何實現liveness analysis?

- 資訊在通過指令時的傳播規則

- 資訊在匯聚時的傳播規則

- 資訊傳播規則的形式化表述

- 基於資訊傳播規則,求解活躍變數集合

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

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

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

示意圖如下:

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

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

舉兩個例子來說明

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

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

與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,其在

其中in(p)是指令p之前的緊鄰程式點處的活躍變數集合,out(p)是指令p之後的緊鄰程式點處的活躍變數集合,succ(p)是指令p的後繼指令,vars(e)是表示式e中所使用的變數。

我們也能從傳播規則看出la屬於backward分析,因為in(p)由out(p)運算得來。 

為什麼是

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

未完待續。

Lucene 資料流分析

理解lucene系統結構的另乙個方式是去 其中資料流的走向,並以此摸清楚lucene系統內部的呼叫時序。在此基礎上,我們能夠更加深入的理解lucene的系統結構組織,以方便以後在lucene系統上的開發工作。這部分的分析,是深入lucene系統的鑰匙,也是進行重寫的基礎。我們來看看在lucene系統...

資料流的分析

現在我就舉乙個資料流的分析 兩主機 a b 連在乙個傻瓜交換機上,同一網段,分析ping包的資料流向。主機a向主機b發ping包,首先,主機a將目標ip位址和自己子網掩碼進行 與 運算,判斷目標是否跟自己在同一網段 不同網段資料交給閘道器處理 接著會查arp表是否有目標主機的mac位址。此時,主機a...

SSIS之資料流任務

資料流任務主要用於執行資料流以提取 轉換 載入源資料。乙個包中可以有多個資料流任務,也可以包含零個資料流任務。下面關係圖顯示含有乙個資料流任務的包 了解資料流任務後,我們就簡要的學習一下如何建立資料流任務。在工具箱中雙擊資料流任務控制項或則將其拖放到控制流頁面中。如圖 你可以根據需求來修改資料流任務...