大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

5.制御構造と配列 場合分け( If Then Else , Select Case ) 繰返し( Do While ) 繰返しその2( For Next )
数学のかたち 数学解析の様々なツール GRAPSE編 Masashi Sanae.
正規表現からのDFA直接構成.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
Fortran と有限差分法の 入門の入門の…
ループで実行する文が一つならこれでもOK
タスクスケジューリング    .
アルゴリズムイントロダクション第2章 主にソートに関して
4章 制御の流れ-3.
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミングができるようになるには…. 一週間に1回では無理! 自分の力でできるだけがんばる
情報伝播によるオブジェクト指向プログラム理解支援の提案
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
IT入門B2 ー 連立一次方程式 ー.
MATLAB測位プログラミングの 基礎とGT (1)
4.2 連立非線形方程式 (1)繰返し法による方法
言語処理系(9) 金子敬一.
6.4 コード最適化 (1)コード最適化(code optimization)
ベイジアンネットワーク概説 3.6 構造の探索アルゴリズム
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
関数 関数とスタック.
Solving Shape-Analysis Problems in Languages with Destructive Updating
最短経路.
ソフトウェア動的更新の理論について 産総研 橋本政朋.
並列計算システム特論演習 SCS特別講義 平成13年10月15日.
第25章 単一始点最短路 3節 Bellman-Fordのアルゴリズム
ネットワーク理論 Text. Part 3 pp 最短路問題 pp 最大流問題 pp.85-94
繰り返し計算 while文, for文.
動的依存グラフの3-gramを用いた 実行トレースの比較手法
帰納変数 iが基本帰納変数 変数iに対して、 i := i±c という形の代入が一つのみ jがiに対する帰納変数
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
アルゴリズムとプログラミング (Algorithms and Programming)
Structured programming
アルゴリズムとデータ構造勉強会 第6回 スレッド木
レジスタの割付け 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第12章5節.
逐次プログラムの正当性(2) 帰納的アサーション法(フロイド法)
コードクローンの動作を比較するためのコードクローン周辺コードの解析
プログラムの制御構造 配列・繰り返し.
フロントエンドとバックエンドのインターフェース
アルゴリズム論 (第12回) 佐々木研(情報システム構築学講座) 講師 山田敬三
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
プログラムの基本構造と 構造化チャート(PAD)
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
JAVAバイトコードにおける データ依存解析手法の提案と実装
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
統計ソフトウエアRの基礎.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
文法と言語 ー文脈自由文法とLR構文解析ー
アルゴリズムからプログラムへ GRAPH-SEARCH
プログラミングⅡ 第2回.
コンパイラ 2012年11月5日
コンパイラ 2011年11月10日
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
第2回独習Javaゼミ 第3章 セクション4~5 発表者 直江 宗紀.
PROGRAMMING IN HASKELL
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
情報処理Ⅱ 第7回 2004年11月16日(火).
PROGRAMMING IN HASKELL
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング序論演習.
場合分け(If Then Else,Select Case) 繰返し(Do While) 繰返しその2(For Next)
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
プログラミング 2 静的変数.
情報処理技法(Javaプログラミング)1 第8回 同じ処理を何回も繰り返すには?
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、 流れグラフという。 開始ブロック プログラムの開始点を含むブロック

B1 B2 B3 B5 B6 B4 i := m-1 j := n t1:= 4*n v := a[t1] i := i+1 t3:= a[t2] if t3<v goto B2 B3 B5 i := j-1 t4:= 4*i t5:= a[t4] if t5<v goto B3 B6 t6:= 4*i x := a[t6] t7:= 4*i t8:= 4*j t9:= a[t8] t10:=4*j a[t10]:=x goto B2 t11:=4*i x :=a[t11] t12:=4*i t13:=4*n t14:=a[t13] a[t12]:=t14 t15:=4*n a[t15]:=x B4 if i>=j goto B6

到達定義 B: 基本ブロック gen[B] kill[B] Bの中で生成され、 Bの終わりに到達する定義の集合 つまり、それ以降に同じ変数への定義はない。 kill[B] Bによって消滅する定義の集合 つまり、Bの中で定義される変数への定義で、 gen[B]に含まれないものの集合

B1 kill[B3] B2 gen[B3] B3 B5 B6 B4 i := m-1 j := n t1:= 4*n v := a[t1] i := i+1 t2:= 4*i t3:= a[t2] if t3<v goto B2 gen[B3] B3 B5 i := j-1 t4:= 4*i t5:= a[t4] if t5<v goto B3 B6 t6:= 4*i x := a[t6] t7:= 4*i t8:= 4*j t9:= a[t8] t10:=4*j a[t10]:=x goto B2 t11:=4*i x :=a[t11] t12:=4*i t13:=4*n t14:=a[t13] a[t12]:=t14 t15:=4*n a[t15]:=x B4 if i>=j goto B6

到達定義 in[B] out[B] in[B]とout[B]はどうやって求めるのか? 到達可能性 Bの先頭に到達する定義の集合 何らかの経路を通って到達すればよい。 (控え目な判断)

B1 B2 in[B2] B3 B5 B6 B4 i := m-1 j := n t1:= 4*n v := a[t1] i := i+1 t3:= a[t2] if t3<v goto B2 B3 B5 i := j-1 t4:= 4*i t5:= a[t4] if t5<v goto B3 B6 t6:= 4*i x := a[t6] t7:= 4*i t8:= 4*j t9:= a[t8] t10:=4*j a[t10]:=x goto B2 t11:=4*i x :=a[t11] t12:=4*i t13:=4*n t14:=a[t13] a[t12]:=t14 t15:=4*n a[t15]:=x B4 if i>=j goto B6

データの流れ方程式 in[B]とout[B]が満たすべき等式 前進型 合併型 in[B] = ∪ out[P] PはBの先行ブロック out[B] = gen[B] ∪ (in[B] - kill[B]) 前進型 inからoutを求める。 合併型 ∪を使う

アルゴリズム(到達定義) for ∀B do out[B] := gen[B] change := true while change do change := false for ∀B do in[B] := ∪ out[P] oldout := out[B] out[B] := gen[B] ∪ (in[B] - kill[B]) if out[B]≠oldout then

アルゴリズム(到達定義) あらゆる実行経路を考えている。 定義が次第に遠くへ伝搬される。 in[B]もout[B]も単調に増加する。 従って、いつかは変化しなくなる (定義の全体が有限だから)。

d1: i:=m-1 d2: j:=n d3: a:=u1 d4: i:=i+1 d5: j:=j-1 d6: a:=u2 d7: i:=u3

d1: i:=m-1 d2: j:=n d3: a:=u1 d1,d2,d3 d4: i:=i+1 d5: j:=j-1 d4,d5 d6: a:=u2 d6 d7: i:=u3 d7

d1: i:=m-1 d2: j:=n d3: a:=u1 d1,d2,d3 d1,d2,d3,d7 d4: i:=i+1 d5: j:=j-1 d4,d5,d3 d4,d5 d6: a:=u2 d6,d4,d5 d4,d5,d6 d7: i:=u3 d7,d5,d6

d1: i:=m-1 d2: j:=n d3: a:=u1 d1,d2,d3 d1,d2,d3,d7,d5,d6 d4: i:=i+1 d5: j:=j-1 d4,d5,d3,d6 d4,d5,d3 d6: a:=u2 d6,d4,d5 d4,d5,d6,d3 d7: i:=u3 d7,d5,d6,d3

d1: i:=m-1 d2: j:=n d3: a:=u1 d1,d2,d3 d1,d2,d3,d7,d5,d6 d4: i:=i+1 d5: j:=j-1 d4,d5,d3,d6 d4,d5,d3,d6 d6: a:=u2 d6,d4,d5 d4,d5,d6,d3 d7: i:=u3 d7,d5,d6,d3

利用可能な式 ?が i:=... を含まなければ、 B1の4*iはB3で利用可能。 ?が i:=... を含んでいても、 t1 := 4*i B2 ? B3 t2 := 4*i ?が i:=... を含まなければ、 B1の4*iはB3で利用可能。 ?が i:=... を含んでいても、 その後で4*iが計算されればよい。

利用可能な式 e_gen[B] e_kill[B] ブロックBで計算され、 Bの終わりで利用可能な式の集合 例えば、y+zという式は、 yまたはzが定義され、 その下にy+zがなければ消滅する。

利用可能な式 out[B] in[B] 流れ方程式 前進 集合積 ブロックBの終わりで利用可能な式の集合 out[B] = e_gen[B] ∪ (in[B] - e_kill[B]) in[B] = ∩ out[P] (Bは開始節でない) in[B] = φ (Bは開始節) 前進 集合積

アルゴリズム(利用可能な式) U : プログラムに現れる式の全体 B1: 開始ブロック in[B1] := φ; out[B1] := e_gen[B1] for B1 と異なる B do in[B] := U; out[B] := U - e_kill[B]; while 変化がある間 do in[B] := ∩ out[P]; PはBの先行ブロック out[B] := e_gen[B] ∪ (in[B] - e_kill[B]); U : プログラムに現れる式の全体 B1: 開始ブロック

生きている変数 流れ方程式 use[B] def[B] 後進 合併 in[B] = use[B] ∪ (out[B] - def[B]) out[B] = ∪ in[S] SはBの後続ブロック use[B] 定義より前にBで使われる変数の集合 def[B] Bで定義される変数の集合(使われる前に定義される) 後進 合併