DAG 圖(Directed Acylic Graph)無環路有向圖優化
基本塊是指程序中一順序執行的語句序列,其中只有一個入口語句(第一個語句)和一個出口語句(最後一個語句)3d
對於一個基本塊來講,執行時只能從其入口語句進入,從其出口語句退出blog
語句 | |
---|---|
出口語句 | 任何控制轉移四元式 |
入口語句 | 所轉向的目標語句 |
一、求四元式序列中各個基本塊的入口語句。編譯
二、對每一入口語句,構造所屬的基本塊,該基本塊由:table
三、凡是未包含在某一基本塊中的語句,都是程序中控制流程不可達的語句,可刪除它們。class
對於下面給出的求最大公因子的程序,能夠根據基本塊的構造規則與其劃分基本塊編譯原理
基本塊構造步驟:變量
(1):由規則 (1) 中的 ① 可知語句 (1) 是一個入口語句
(2):由規則 (1) 中的 ② 可知,語句 (3) 和 (8) 均是人口語句
(3):由規則 (1) 中的 ③ 可知,語句 (5) 是二我的口語句,能夠用 「+」 在人口語句的左側做標記。
(4):由規則 (2) 能夠劃分該程序爲四個基本塊,它們分別是:原理
程序中在代碼段左側對各個基本塊進行了標記。cli
定義: 以基本塊爲結點,控制程序流向做爲有向邊,畫出的有向圖稱爲流圖。
特色:
若是一個結點的基本塊的入口語句是程序的第一條語句,則稱此結點爲首結點
一個控制流程圖可表示成一個三元組:
G=(N,E,n0 )
N:全部結點(基本塊)集;
E:全部有向邊集;
n0 :首結點。
有向邊:
當下述條件有一個成立時,從結點i有一有向邊引向結點 j:
對程序基本塊:
構造如下程序控制流圖:
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型
對於基本塊 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
解釋:
與原來的基本塊相比較能夠看出:
除了能夠應用 DAG 進行上述的優化外,還能夠從基本塊的 DAG 中獲得一些其餘信息:
若是確認某結點的一個附加標記在基本塊後不會被引用,則該標識符的定值語句能夠做爲死代碼被刪除。
假設上面例子中 S0~S6。在基本塊後面都不會被引用只有 R, H 在基本塊出口是活躍的則優化後的四元式序列能夠寫爲:
(1)S2 := T-C
(2)S3 := T+C
(3)R := 2/S3
(4)H := R*S2