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


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

DAG 圖(Directed Acylic 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM