言語処理工学A補助プリント1
				井上 克郎  
コントロールフロー解析、データフロー解析
  参考図書 Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools
		Addison Wesley, 1986   0-201-10088-6 この分野のバイブル

(1)基本ブロックの作成(Basic Block)
基本ブロック:3番地コードの列で、その実行は、一番上の命令のみから始まり、途中の命
令で止まったり、分岐せずに、最後の命令まで到達するもの。最後の命令での分岐は許され
る。途中での飛び込み許さない。
コンパイラで3番地コードを生成後、最適化の最初の段階として、3番地コード列をできる
だけ長い基本ブロックに分割する。

Step 1: Leader(基本ブロックの最初の命令)を求める。以下のいずれかの条件に当てはまる
ものをリーダとする
	条件1; 3番地コード列の最初の命令
	条件2; 条件、無条件分岐の行き先になっている命令(ラベルが付いている)
	条件3; 条件、無条件分岐命令の直後の命令
Step 2: 各リーダを最初の命令とし、次のリーダの直前を最後の命令として基本ブロックを
構成する。もし、次のリーダを見ずにプログラムが終わった場合は最後の命令をその基本ブ
ロックの最後の命令として構成する。

演習問題:教科書171頁の8.3のコードのフローグラフを作れ

各基本ブロックを頂点として、制御の移動の可能性があるばあいに対応する基本ブロック間
に辺をひいたものを、「フローグラフ」と呼ぶ。辺の始点の基本ブロックを終点の基本ブロ
ックに対してPredecessor、逆に終点を始点に対してSuccessorと呼ぶ。
フローグラフの入り口の頂点を開始頂点(initial node)と呼ぶ。

(2)ループの検出
Dominator支配接点: フローグラフ上で開始頂点からある頂点nに至るすべての経路が途
中、頂点dを経由する場合、dはnのdominatorと呼ぶ。各頂点は、自分自身のdominator
である。
演習:先ほど求めたフローグラフの各頂点のdominatorを求めよ。

dominatorの関係を木で表現したものをdominator木と呼ぶ。また、ある頂点のdominator
のうち、自分自身以外で、もっとも近いものをimmediate dominatorと呼ぶ。

Dominatorの求めかた
n0 --- フローグラフの入り口の頂点
N --- フローグラフの全頂点
D(n) --- 頂点nのdominatorを入れる集合
 1	D(n0) := {n0};
 2	for n  in  N-{n0}  do  D(n):= N;
 3	while changes to any D(n) occur do
 4		for n in N-{n0} do
 5			D(n):= {n} ∪    ∩D(p) ;
					pはnの親

演習問題:このプログラムは、必ず停止するか?その理由は?

Natural Loop:フローグラフの部分グラフで以下の性質を持つもの。
* 他の部分グラフからの唯一の入り口を持ち(この入り口はヘッダーと呼ばれる)、ヘッ
ダーはループのなかの各頂点のdominatorになっている。
* 各頂点からヘッダーへ至る一つ以上の経路がある。ヘッダーに入るこの部分グラフの辺
をBack edge後退辺という。

Natural Loop の求めかた
 1 まず、すべてのback edgeを求める。(dominateされる頂点からdominatorに至る辺
を見つける)
 2 各back edgeについて以下の手続きを行う。
	stack:= empty;
	loop:={d} ;
	insert(n) ;
	while stack is not empty do begin
		pop m
		for each predecessor p of m do insert(p)
	end

	procedure insert(m);
	if m is not in loop then begin
		loop:= loop ∪ {m};
		push m onto stack
	end;

簡約可能フローグラフReducible Flow Graph
今、フローグラフからback edgeを除いたグラフが、入り口から各頂点が到達可能な閉路無
しのグラフの場合、そのフローグラフを簡約可能と言う。if-then-else, while-do, continue, 
breakなどの制御構造によって作られるプログラムは、簡約可能なフローグラフを作る。


次のテキストへ