1. 程式人生 > >《編譯原理》畫 DAG 圖與求優化後的 4 元式程式碼- 例題解析

《編譯原理》畫 DAG 圖與求優化後的 4 元式程式碼- 例題解析

《編譯原理》畫 DAG 圖與求優化後的 4 元式程式碼- 例題解析

DAG 圖(Directed Acyylic Graph)無環路有向圖

(一)基本塊

基本塊是指程式中一順序執行的語句序列,其中只有一個入口語句(第一個語句)和一個出口語句(最後一個語句)

對於一個基本塊來說,執行時只能從其入口語句進入,從其出口語句退出

語句
出口語句 任何控制轉移四元式
入口語句 所轉向的目標語句

(二)劃分基本塊的步驟

1、求四元式序列中各個基本塊的入口語句。

  • ① 程式的第一個語句
  • ② 能由條件或無條件轉移語句轉移到的語句
  • ③ 緊跟在條件轉移語句後面的語句

2、對每一入口語句,構造所屬的基本塊,該基本塊由:

  • 1)該入口語句到下一入口語句(不包括下一入口語句)之間的語句序列組成
  • 2)該入口語句到一轉移語句(包括該轉移語句)之間的語句序列組成
  • 3)該入口語句到一停語句(包括該停語句)之間的語句序列組成

3、凡是未包含在某一基本塊中的語句,都是程式中控制流程不可達的語句,可刪除它們。

例題:

對於下面給出的求最大公因子的程式,可以根據基本塊的構造規則與其劃分基本塊

基本塊構造步驟:

(1):由規則 (1) 中的 ① 可知語句 (1) 是一個入口語句
(2):由規則 (1) 中的 ② 可知,語句 (3) 和 (8) 均是人口語句
(3):由規則 (1) 中的 ③ 可知,語句 (5) 是二個人口語句,可以用 “+” 在人口語句的左側作標記。

(4):由規則 (2) 可以劃分該程式為四個基本塊,它們分別是:

  • 語句 (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