《編譯原理》畫 DAG 圖與求優化後的 4 元式程式碼- 例題解析
《編譯原理》畫 DAG 圖與求優化後的 4 元式程式碼- 例題解析
DAG 圖(Directed Acyylic Graph)無環路有向圖
(一)基本塊
基本塊是指程式中一順序執行的語句序列,其中只有一個入口語句(第一個語句)和一個出口語句(最後一個語句)
對於一個基本塊來說,執行時只能從其入口語句進入,從其出口語句退出
語句 | |
---|---|
出口語句 | 任何控制轉移四元式 |
入口語句 | 所轉向的目標語句 |
(二)劃分基本塊的步驟
1、求四元式序列中各個基本塊的入口語句。
- ① 程式的第一個語句
- ② 能由條件或無條件轉移語句轉移到的語句
- ③ 緊跟在條件轉移語句後面的語句
2、對每一入口語句,構造所屬的基本塊,該基本塊由:
- 1)該入口語句到下一入口語句(不包括下一入口語句)之間的語句序列組成
- 2)該入口語句到一轉移語句(包括該轉移語句)之間的語句序列組成
- 3)該入口語句到一停語句(包括該停語句)之間的語句序列組成
3、凡是未包含在某一基本塊中的語句,都是程式中控制流程不可達的語句,可刪除它們。
例題:
對於下面給出的求最大公因子的程式,可以根據基本塊的構造規則與其劃分基本塊
基本塊構造步驟:
(1):由規則 (1) 中的 ① 可知語句 (1) 是一個入口語句
(2):由規則 (1) 中的 ② 可知,語句 (3) 和 (8) 均是人口語句
(3):由規則 (1) 中的 ③ 可知,語句 (5) 是二個人口語句,可以用 “+” 在人口語句的左側作標記。
- 語句 (1)、(2) 組成的基本塊 B1
- 語句 (3)、(4) 組成的基本塊 B2
- 語句 (5)、(6) 和 (7) 組成的基本塊 B3
- 語句 (8) .(9) 組成的基本塊 B4
程式中在程式碼段左側對各個基本塊進行了標記。
(三)程式控制流程流圖
定義: 以基本塊為結點,控制程式流向作為有向邊,畫出的有向圖稱為流圖。
特點:
- 具有唯一首結點的有向圖
- 從首結點開始到流圖中任何結點都有通路
如果一個結點的基本塊的入口語句是程式的第一條語句,則稱此結點為首結點
程式控制流程流圖的表示
一個控制流程圖可表示成一個三元組:
G=(N,E,n0
N:所有結點(基本塊)集;
E:所有有向邊集;
n0 :首結點。
有向邊:
當下述條件有一個成立時,從結點i有一有向邊引向結點 j:
- ① 基本塊 j 在程式的位置緊跟在i後,且 i 的出口語句不是無條件轉移或停語句
- ② i 的出口是 goto(S) 或 if goto(S),而 (S) 是 j 的入口語句
構造程式控制流圖
對程式基本塊:
構造以下程式控制流圖:
(四)基本塊的 DAG 表示
DAG Directed Acyclic Graph 無環路有向圖
定義:
(1) 在一個有向圖中,若結點 ni 有弧指向結點 nj,則 ni 是 nj 的父結點,nj 是 ni 的子結點;
(2) 若 n1,n2,…,nk 間存在有向弧 n1→n2→…→nk,則稱 n1 到 nk 之間存在一條通路,若有 nk=n1,則稱該通路為環路;
(3) 若有向圖中任意通路都不是環路,則稱該圖為無環路有向圖(DAG)
用來描述基本塊的 DAG:
(1) 圖的葉結點以一識別符號或常數做標記,表示該結點代表該變數或常數的值。
(2) 圖的內部結點以一運算子作為標記;
(3) 圖中各個結點上可能附加一個或多個識別符號,表示這些識別符號具有該結點所代表的值,簡稱附標。
四元式對應的 DAG 結點形式
按其四元式對應結點的後繼個數分成四種類型:0型、1型、2型、3型
(五)DAG 圖構造例題
對於基本塊 P
(1)S0 := 2
(2)S4 := 2
(3)S1 := 1.5
(4)S2 := T-C
(5)S3 := T+C
(6)S5 := S3
(7)R := 2/S3
(8)S6 := R
(9)H := R*S2
(1)試用 DAG 進行優化並重寫基本塊
(2)假定只有 R,H 在基本塊出口是活躍的,試寫出優化後的 4 元式序列
(只需要還原活躍變數)
解析:
(1)畫出 DAG 圖如下:
畫圖的步驟就是:根據基本塊,一部一部組裝
(2)假定只有 R,H 在基本塊出口是活躍的,試寫出優化後的 4 元式序列
(只需要還原活躍變數)
優化後的 4 元式程式碼可以寫為:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2
解釋:
與原來的基本塊相比較可以看出:
- 原基本塊中的 (2) 和 (7) 中的已知量都已經合併。因為 (2) 中 S4 := 2,(7) 中用 2,所以合併。
- (5) 和 (8) 中的公共子表示式 T+C 只在 (5) 中計算一次,在 (8) 中 直接引用其結果,所以刪除了多餘運算。
- (6) 中的無用賦值已被刪除。S5 := S3,S5 後面沒有再用,所以就和 S3 一起表示。
除了可以應用 DAG 進行上述的優化外,還可以從基本塊的 DAG 中得到一些其他資訊:
- DAG 葉結點上標記的識別符號是在該基本塊之前的基本塊內被定值,並在該基本塊內被引用的識別符號。
- DAG 各結點上的附加識別符號是在基本塊內被定值,並可以在基本塊後被引用的識別符號。
如果確認某結點的一個附加標記在基本塊後不會被引用,則該識別符號的定值語句可以作為死程式碼被刪除。
假設上面例子中 S0~S6。在基本塊後面都不會被引用只有 R, H 在基本塊出口是活躍的則優化後的四元式序列可以寫為:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2