控制流分析是資料流分析以及後端優化的基礎,其的目標是建立控制流圖(control flow graph)。
控制流圖的結點代表乙個基本塊(basic block), 邊代表控制流的運動方向。
基本塊: 其中的**要麼全部執行,要麼全部不執行。基於這原則,有下列3種情況導致**分入不同的basic block中。
1. 當前處理指令為分支指令,比如 if,goto,throw,switch
2. 當前指令為其他跳入指令的目標指令
3. 當前指令為return指令
通過對指令序列的一遍掃瞄,記錄每個基本塊的出邊,以及出邊的目標結點(successor),同時記錄基本塊的前驅結點(predecessor),以此建立控制流圖的整體邏輯。
在後繼資料流分析以及優化中,loop的識別尤為的重要。這裡的loop不是通常意義下的loop,而是稱為自然迴圈的loop。對他的定義是存在n->d,d為n的支配結點,即存在回邊。對於這樣的迴圈,d是迴圈的頭結點,n為迴圈的退出結點。從n開始做反向的深度搜尋,在d前被訪問到的結點都屬於該迴圈的結點。演算法具體可以參考龍書全域性優化那章關於loop的描述。
支配結點的定義: d在所有從cfg的入口結點到n的路徑上,那麼d就是n的支配結點。計算支配結點的演算法可以描述為:
1. dom(entry) = {}
2. dom(n) = 所有n的前驅的dom的並集 + n自己
按通常情況來看,比如c語言形成的**所形成的cfg是強連通的,即可以通過entry node訪問到所有的結點。但是當**中存在異常處理模組時,可能導致圖失去強連通性,變成樹林。遇到這種情況,可以將異常塊從cfg中剝離,將每個catch塊的入口作為首結點,分別處理。在優化完之後再恢復到原來的邏輯。
反編譯原理 5 控制流分析
控制流結構恢復 變數和型別恢復是反編譯器中端向後端轉化最關鍵的兩個步驟,本文討論控制流結構恢復。主要是概述鯨書 高階編譯器的設計與實現 第7章控制流分析,並且增加了一些內容,所涉及的相關 書籍自行查詢學習,還可以從維基百科了解學習。可以從 notes on graph algorithms used...
python控制流教程 python控制流
1.if.elif.else 語法 if 判斷條件 語句.elif 判斷條件 語句.else 語句.elif語句可以有0個或多個 2.while和for迴圈 while 判斷條件 語句.for iterating var in sequence statements s 可以在while迴圈體中巢狀...
mysql流控制 mysql 控制流函式
ifnull expr1,expr2 如果 expr1 為非 null 的,ifnull 返回 expr1,否則返回 expr2。ifnull 返回乙個數字或字串值 mysql select ifnull 1,0 1 mysql select ifnull null,10 10 如果 expr1 e...