静的単一代入形式に基づく最適化に関する研究

コンパイラ・インフラストラクチャにおける
静的単一代入形式最適化部の実現
佐々政孝
福岡岳穂
滝本宗宏
(東工大) (ソニーCE) (理科大)
背景

静的単一代入形式(SSA形式)



データフロー解析や最適化を見通しよく行える
SSA形式最適化の研究基盤として使える適当なコ
ンパイラがほとんど存在しなかった(SUIFもほとんど
扱わない)
SSA形式に基づく変換と最適化をコンパイラ・インフ
ラストラクチャCOINSに組み込む

SSA形式への変換と逆変換

SSA形式上の種々の最適化と有用な変換
設計と実装の方針
コンパイラ・インフラストラクチャでは研究目的だけではない考察と決断が
必要:方針を立てる,既知のものと研究とのバランス,...
1. 複数のアルゴリズムが知られているもの
→ 比較検討の上,採用するアルゴリズムを決定
2. 共通インフラストラクチャとして → 基本的な最適化を含める,
研究基盤として活用できる例示として → オリジナルな最適化も含める
3. アルゴリズムの比較評価のため
→ アルゴリズムのヴァリエーションをオプションで指定できる
4. SSA形式の分野で問題として示唆されてはいるが実際にどう解決するか
が示されていない種々の点
→ それぞれ一つの解決法を示す
5. 教育・研究基盤としての参照実装
→ 詳しい仕様書を提供,読解性・保守性のよいコーディング
2 準備
C
O
I
N
S
コ
ン
パ
イ
ラ
・
イ
ン
フ
ラ
C
プログラム
C
言語解析
Fortran
プログラム
Java
プログラム
Fortran
言語解析
Java
言語解析
新言語
プログラム
新言語
解析
C
プログラム
HIR→C
高水準中間表現(HIR)
基本最適化
HIR→LIR
C
ループ並列化 SMP並列化 プログラム
LIR→C
低水準中間表現(LIR)
SSA最適化
SPARC
x86
ARM
MIPS
SH-4
Power PC
コード
命令選択
レジスタ割付け
命令スケジュール
コード生成
SIMD並列化
マシン記述
SPARC
x86
ARM
MIPS
SH-4
Power PC
合計23万行
SSA形式(静的単一代入形式)
a = x + y
a = a + 3
b = x + y
(a) 通常形式
a1 = x0 + y0
a2 = a1 + 3
b1 = x0 + y0
(b) SSA形式
SSA形式:各変数の定義が字面上一つ.
SSA形式
L1 a = 1
L3
L2 a = 2
… = a
(a) 通常形式
φ関数
L1 a1 = 1
L3
L2 a2 = 2
a3 = f(a1:L1,a2:L2)
… = a3
(b) SSA形式
4 SSA最適化部
静的単一代入(SSA)形式最適化部の構成
基盤部
ソース
プログラム
言語
解析
SSA最適化部
LIR->SSA変換
(3種類のヴァリエ
ーション)
高水準中間表現(HIR)
HIR
to
LIR
低水準中間表現(LIR)
の制御フローグラフ(CFG)
(通常形式LIR)
コード
生成
目的
コード
SSA形式LIR
のCFG &
最適化された
SSA形式LIR
のCFG
SSA->LIR逆変換
2種類
(1つは3種類のヴァリエーション)
+
合併(2種類)
SSA最適化
コピー伝播
条件付定数伝播
共通部分式除去
質問伝播大域値番号付
無用コード除去
ループ不変計算移動
帰納変数の最適化
...
SSA形式上の有用な変換
危険辺の分割
3番地コードへ変換
基本ブロック結合
Javaで
約15,000行
HIRでのSSA最適化プロトタイプも作成して検討した結果,LIRレベルで行うこととした
SSA形式への変換
設計方針にしたがい,2つの有力なアルゴリズムをプロト
タイプで比較し,Cytron法(支配辺境を用いる)を採用.
変換時間 (milli sec)
900
800
700
600
500
Cytron
Sreedhar
400
300
200
100
0
0
1000
2000
3000
4000
通常プログラムの制御フローグラフのノード数
SSA形式から通常形式への
逆変換

主なアルゴリズム





Briggsらの方法
Sreedharらの方法
設計方針にしたがい,これらを比較検討したところ,合併
を行っても,SSA逆変換の際に挿入されるコピー文の数な
どからSreedharらの方法に優位性があると認められた.
→ 既存のコンパイラでは採用が稀であったが,Sreedhar
らの方法を推奨として採用した.
Sreedharらの3つのヴァリエーションを実装(実はのちに
Briggsらの方法も実装)
2種類の合併も実装(これらもみなオプションで指定でき
る)
その後この方針の妥当性が実
証された
Briggs法+合併とSreedhar法による目的コードの実行時間の相対比.
Sreedhar法による目的コードの実行時間の方が短い.[伊藤2005]
SSA最適化
(1)基本的な最適化
(設計方針により,共通インフラストラクチャとして基本的な最適化を含める)
コピー伝播

条件分岐を考慮した定数畳み込みと定数伝播

支配関係に基づく共通部分式除去

無用コード除去

無用φ関数除去

空の基本ブロック除去

ループ不変計算のループ外移動

ループの帰納変数に関わる演算の強さの軽減と判定の置き換え
(これらは任意の回数,順序で適用できる)

この他,変換として,危険辺の分割,前処理として,ループ構造の変換
(while型ループを if-do-while型ループへ),など.

最適化の例
i = 1;
j = 1;
k = 0;
while (k < 100) {
if (j < 20) {
j = i;
k = k + 1;
} else {
j = k;
k = k + 2;
}
}
printf("%d¥n",j);
条件分岐を考慮した定数畳み込みと伝播
k = 0;
while (k < 100) {
k = k + 1;
}
printf("%d¥n",1);
(本当はSSA形式)
‘j’ が常に 1であることが解
析できる
whileの中の if-elseや黒字
の部分が除去される
SSA最適化
(2)高度最適化

大域的再結合(global reassociation)

メモリ全体を一つの塊とみなす素朴な別名解析

効率的な質問伝播を用いた大域的値番号付けに
よる部分冗長性除去
(後者2つはこのSSA最適化部が研究基盤になる
ことの例示として新たに考案した最適化を組み込
んだ)
メモリ全体を一つの塊とみなす
素朴な別名解析
■
■
COINSのLIRでは別名の情報は得られない.
そこで,別名が生じる可能性のある変数については安
全のためメモリに置いたままにしていた.
このような変数についても,メモリへの書き込みがない
間はこの変数の別名に変更はない,とみなす解析.
if (a[j] < min) {
min = a[j];
k = j;
}
if (t = a[j], t < min) {
min = t;
k = j;
共通部分式
除去で効果 }
5 実装に当たっての問題点
の解決
実装に当たって解決すべき点がいろい
ろある
(既発表のアルゴリズムの誤り,問題として議論されている点)
1. Briggs のSSA 逆変換アルゴリズムの修正
2. Sreedhar のSSA逆変換アルゴリズムの誤りの訂正
と実装上の注意の指摘
3. 積極的な最適化をどこまで許すかの決定
4. 最適化アルゴリズムでのφ関数の適切な取扱い
→それぞれ一つの解決を与え,仕様書に詳しく記述
積極的な最適化をどこまで許すかの決定
...
if(true)
print(1)
無限ループ
最終出力に
影響なし
?
もともとは
出なかった出力
print(1)
積極的な最適化(Appel)
積極的な無用コード除去を行いつつ,ループから出るための条件分岐
「if (true)」を「明らかに生きているコード」とする.
これにより,無限ループはそのまま保たれる.
最適化でのφ関数の適切な取扱い
無用コード除去の危うい例
B
...
if(...)
B
?
P
x3 = f(x1:P,x2:B)
最適化前
...
if(...)
P
x3 = f(x1:P,x2:B)
1),18),19)の既存アルゴリズム(誤)
本実現では既存アルゴリズムを改訂し,Φ関数の引数と関連付けられているブロックが制
御依存する条件分岐文を除去しないようにした.これにより,右図への変換は行われない.
(Φ関数は制御フローとデータフローを含んでいる)
最適化が保守的すぎないか?
No, 無用コード除去の望ましい例を実現
B
...
if(...)
...
if(...)
...
x2 = f(x1:P,x1:B)
x2 = x1
x2 = x1
P
最適化前
無用Φ関数除去
無用コード除去
6 評価
■
性能の評価
■
インフラストラクチャとしての評価
多数のオプション・フラグによる評価
→ SSA最適化部のお勧め決定
SPEC CPU2000. SUN Fire V440 (UltraSPARC III, 1GHz*4, メモリ8GB).単位はsec.
ssa1
ssa2
ssa3
ssa4
-------------------------------------------------------------------164.gzip
3.97
4.02
4.03
3.97
175.vpr
5.84
5.82
5.85
5.88
181.mcf
0.812
0.738
0.826
0.736
197.parser
6.73
6.77
6.82
6.72
254.gap
2.32
2.31
2.47
2.45
256.bzip2
26.6
26.3
26.6
26.3
300.twolf
0.623
0.622
0.645
0.623
171.swim
2.50
3.04
3.06
2.50
172.mgrid
108
123
123
107
173.applu
1.19
1.37
1.45
1.21
177.mesa
5.28
5.28
5.36
5.46
179.art
17.0
16.7
16.9
16.2
183.equake
3.13
3.32
3.17
3.34
188.ammp
24.0
22.4
22.6
23.4
-------------------------------------------------------------------ssa1:
ssa2:
ssa3:
ssa4:
prun/divex/cse/cstp/dce/hli/osr/hli/cpyp/cstp/cse/cpyp/cstp/dce/ebe/srd3
prun/divex/cpyp/cse/cstp/dce/hli/cstp/osr/cse/cstp/cse/dce/cbb/ebe/srd3
prun/gra/divex/cpyp/cse/cstp/dce/hli/cstp/osr/cse/cstp/cse/dce/cbb/ebe/srd3
prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3
SSA最適化のお勧め:ssa4を-O2オプションとして採用
最適化のパスを増やせばよいという訳ではない.キャッシュやパイプラインの影響も大.
評価 - SSA最適化のみの性能(SPEC CPU2000)
SUN Blade 1000 (UltraSPARC III, 750MHz*2, メモリ1GB).実行時間の単位は秒.
coins-noopt: COINS 基盤部最適化オプションなし
ssa-O2-no-memory-analysis: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3,
ssa-no-memory-analysis で指定されるSSA 最適化を行ったもの
ssa-O2:
ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cse/dce/srd3
ssa-preqp1: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/preqp/dce/srd3
ssa-preqp: ssa-opt=prun/divex/cse/cstp/hli/osr/hli/cstp/cpyp/preqp/cstp/rpe/dce/srd3
gcc-O2:
gcc -O2 または g77 -O2
評価 - SSA最適化のみの性能(SPEC CPU2000)
目的コードの実行時間の相対比 (COINS最適化オプションなし=1)
評価 - SSA最適化のみの性能(SPEC CPU2000)
目的コードの実行時間の相対比(COINS最適化オプションなし=1)
「メモリ全体を一つの塊とみなす素朴な別名解析」の効
果が見て取れる.
■ssa-O2-no-memory-analysis 対 ■ssa-O2 で
2%から12%程度の性能向上.
評価 - SSA最適化のみの性能 考察



前図は他の最適化を適用せずにSSA最適化のみを適用した結果
SSA最適化単体での結果はgccの-O2オプションの結果に全体とし
ては及ばない(ある意味で当然)
その理由として
gccの目的コードではレジスタ・プロモーションや命令スケジューリングがなされ
ているが,これはSSA最適化だけでは処理できない
 SSA形式では配列SSAなど,スカラーでない変数の最適化が確立されていない


COINSの全最適化をONにして比べたい所であるが


COINSではHIR上の最適化や別名解析,レジスタ・プロモーションや命令スケ
ジューリングも行われているが,みな試験実装の段階にありSPEC ベンチマー
クの結果を得られない
今後さらに検討する予定
参考 レジスタ・プロモーションや命令スケジューリ
ングを行うとCOINSの性能は十分(小規模プログラム)
■ 「ssa+S+R」=ssa-O2 +命令スケジューリング+大域変数のレジスタ・プロモーション
■「ssa+S+R」では全体的に■ gcc の-O2 オプションより優れた性能
評価 - インフラとしての評価

SSA最適化部の実装に当たっての問題点の解決


(前述)
教育・研究への適用
■
■
■
COINSを用いたコンパイラの集中講義(2004年7月)
このときに用いたSSAの豊富な例題と使用法はウェブページで公開
効率的な質問伝播を用いた部分冗長性除去 (前述).もともとは
COINSの外のユーザ.のちに本システムに組み込んだ.
その他,当該研究室の大学院生による研究も多い
7 関連研究
コンパイラ・インフラストラクチャを中心に



SUIFとMachine SUIF
Scale
gcc
SUIFとMachine SUIF

SUIF




コンパイラ・インフラストラクチャの中で最もよく知られ,研究用に広く使
われた.
SSA 形式についてはほとんど扱っていない.
National Compiler Infrastructureの終了に伴い,もはや保守されていな
い.
Machine SUIF



一連のバックエンドの処理機構を備え,ターゲットにあまり依存しない解
析と最適化ができる,という特徴がある. SUIFとともに用いる.
SSA 形式の最適化については無用コード除去があるだけである.
リリースも2002年以後は出ていない.
Scale





新しい高性能アーキテクチャの研究のためのコンパイラ・インフラストラク
チャ.
SPEC ベンチマークのC プログラムからSPARC機械語への変換で,オブ
ジェクトコードの実行性能はgcc とほぼ同等から1.7 倍(の遅さ).
SSA 最適化として,疎な条件分岐を考慮した定数伝播,部分冗長性除去,
コピー伝播,値番号付け,ループ不変コード移動,インライン化,ループ展
開,を実装.
SSA 形式最適化については,COINS との類似性がある.
ただし,COINS の特徴である,SMP 計算機用並列化やSIMD 命令を用い
る命令レベル並列化などの並列化機能や,マシン記述によるリターゲット
機能はない.
gcc




gcc-4.0.0に含まれたTree SSA はSSA形式最適化モジュールで,最適
化として,無用コード除去,条件分岐を考慮した定数伝播,部分冗長性
除去,支配木ベースの最適化(定数伝播,コピー伝播,冗長性除去),
集合体のスカラー置換,無用ストアの除去,など.
この最適化の内容は,COINSのSSA最適化部に重なるものも多い.
しかしgcc については,ソースが大きく複雑で手を入れにくい, C言語で
書かれているのでバグ取りが難しくメモリ管理に誤りが入りやすい,RTL
をファイルに書いて処理して再入力する手段がない,などの弱点.
これに対して,COINSは,Javaで記述されており,メモリ割り当ての誤り
がほとんどなくバグ取りがしやすい,ソースの大きさが手頃である,LIR
をファイルに書いて処理して再入力することができる,などの利点.
8 まとめ
■
教育,研究用基盤を目指したコンパイラ・インフラストラクチャにおけるSSA形
式最適化の実現について述べた.
■
設計方針を立てて実施したことは,目標の実現に大きく寄与した.
■
SSA形式への変換と逆変換については,比較評価して良い方法を採用した.
■
SSA形式最適化の実装に当たっては,種々の解決すべき問題があったが,
それぞれに一つの解決を与え,詳しいドキュメントとして残した.
■
基本的なSSA形式最適化をほとんど実装してある.
■
アルゴリズムの比較評価のために種々のヴァリエーションを指定できる.
■
参照実装として用いることができるように,読解性,保守性のよいコーディン
グを心がけ,詳しい仕様書を提供した.
今後の課題
■
■
COINSの最適化の効果がgcc等にまだ及ばない点を検討し,
他の最適化と連携しつつSSA最適化の改良を施す.
仕様書の英文化もほぼなされているので,海外への情報発
信に努める.
設計方針にしたがい,
最小,半ば刈り込んだ,
刈り込んだSSA形式の
いずれへも変換できる
x =…
=x
y =…
z =…
x =…
=x
y =…
z =…
=y
=y
=z
Normal form
x1=…
= x1
y1=…
z1=…
x2=…
= x2
y2=…
z2=…
x1=…
= x1
y1=…
z1=…
x2=…
= x2
y2=…
z2=…
x1=…
= x1
y1=…
z1=…
x2=…
= x2
y2=…
z2=…
= y1
= y2
= y1
= y2
= y1
= y2
x3= f(x1,x2)
y3= f(y1,y2)
z3= f(z1,z2)
= z3
Minimal SSA form
y3= f(y1,y2)
z3= f(z1,z2)
= z3
Semi-pruned SSA form
z3= f(z1,z2)
= z3
Pruned SSA form
アクセス方法
COINSプロジェクトURL
http://www.coins-project.org/
からSSA最適化のページへ
概要
SSA最適化の例
SSA形式とは
SSA最適化の詳しいスライド
集中講義資料(デモ)
仕様書
論文発表資料
評価 - インフラとしての評価

SSA 最適化部の実装に当たっての問題点の解決





SSA 変換・逆変換アルゴリズムの注意点の指摘と誤りの訂正
積極的な最適化をどこまで許すかの決定
最適化アルゴリズムでのΦ関数の適切な取扱い
これらをドキュメントとして残した
教育・研究への適用
■
■
■
COINSを用いたコンパイラの集中講義(2004年7月)
このときに用いたSSAの豊富な例題と使用法はウェブページで公開
効率的な質問伝播を用いた部分冗長性除去 (前述).もともとは
COINSの外のユーザ.のちに本システムに組み込んだ.
その他,当該研究室の大学院生による研究も多い
SUIFとMachine SUIF

SUIF






コンパイラ・インフラストラクチャの中で最もよく知られ,研究用に広く使われた.
最適化と並列化を協調させたコンパイラの研究を支援し,特徴として,オブジェク
ト指向言語を扱う中間表現がある,解析用インフラが整っている,別名解析があ
る,手続き間の配列解析や並列化解析がある,など
入力言語は,Fortran,C,C++,Java,出力は,C 言語,およびMachine SUIF を
経由してAlpha とx86 の機械語
SSA 形式についてはほとんど扱っていない.
National Compiler Infrastructureの終了に伴い,もはや保守されていない.
Machine SUIF



一連のバックエンドの処理機構を備え,ターゲットにあまり依存しない解析と最
適化ができる,という特徴がある. SUIFとともに用いる.
SSA 形式の最適化については無用コード除去があるだけである.
リリースも2002年以後は出ていない.
Scale

新しい高性能アーキテクチャの研究のためのコンパイラ・インフラストラクチャ.

入力言語は,Fortran,C,Java.出力は,C言語,AlphaとSPARCのアセンブリ.

別名解析,配列の依存テスト,ループ変換,SSA最適化,スカラー最適化.




SPEC ベンチマークのC プログラムからSPARC機械語への変換で,オブジェクト
コードの実行性能はgcc とほぼ同等から1.7 倍(の遅さ).
SSA 最適化として,疎な条件分岐を考慮した定数伝播,部分冗長性除去,コピー
伝播,値番号付け,ループ不変コード移動,インライン化,ループ展開,を実装.
Scale は,以前はC言語への変換しか実現していなかったが,現在では,アセンブ
リ言語も生成しており,Java で記述されていること,SSA 形式最適化を含んでい
ること,などCOINS との類似性がある.
ただし,COINS の特徴である,SMP 計算機用並列化やSIMD 命令を用いる命令
レベル並列化などの並列化機能や,マシン記述によるリターゲット機能はない.
gcc





数年来Tree SSAと呼ばれるSSA形式最適化の試みがされていたが,Tree SSA
のブランチは本体にマージされ,gcc-4.0.0にも含まれた.
Tree SSA は木構造を用いたSSA形式最適化モジュールで,最適化として,無用
コード除去,条件分岐を考慮した定数伝播,部分冗長性除去,支配木ベースの
最適化(定数伝播,コピー伝播,冗長性除去など),集合体のスカラー置換,無
用ストアの除去,などを含んでいる.
この最適化の内容は,COINSのSSA最適化部に重なるものも多い.
しかしgcc については,ソースが大きく複雑で手を入れにくい, C言語で書かれ
ているのでバグ取りが難しくメモリ管理に誤りが入りやすい,RTL をファイルに
書いて処理して再入力する手段がない,などの弱点が指摘されている.
これに対して,COINSのSSA最適化部は,Javaで記述されており,メモリ割り当
ての誤りがほとんどなくバグ取りがしやすい,ソースの大きさが手頃である,LIR
をファイルに書いて処理して再入力することができる,などの利点がある.