GCC SSA形式
GCC SSA形式について調べていたら、SSA形式について一番分かりやすい解説が載っている文献を見つけた。以下、全て受け売り抜粋。
「ふつうのコンパイラをつくろう」(青木峰郎著)から引用
-------------------------------
大規模なデータフロー解析とSSA形式
関数全体や、複数の関数をまたがって最適化するには、そのコード全体におけるデータの流れを解析する必要があります。データの流れとは、「この式で計算された値がどこに使われているか」という情報のことです。このデータの流れの解析のことをデータフロー解析と言います。変数の生存性解析もデータフロー解析の一種です。
基本ブロックの範囲を越えてデータフロー解析を行うには、SSA形式(static single assignment form)と呼ばれる中間形式を使うのが一般的です。GCCもバージョン4からはSSA形式の中間表現を使っています。
SSA形式とは、1つの変数にはただ一度だけ代入(初期化)が行われるように、変数に別名を付けて変形した形式のことです。例えば次のC言語のプログラムは i に何度も代入しています。
----------
int i =x * 5;
i += 6;
i *= 2;
----------
このプログラムをSSA形式に変換すると次のようになります。
----------
int i0 =x * 5;
i1 = i0 + 6;
i2 = i1 * 2;
----------
SSA形式の利点は、変数の値が明確に定まっており、途中で変化しないことです。例えば上記のプログラムでは変数i0の値は、最初から最後までx * 5です。
その結果としてSSA形式を使うとデータフロー解析を高速かつ少ないメモリで行うことができます。またSSA形式を使うと、文1つのような小さな単位からプログラム全体まで、同じアルゴリズムで最適化できるようになることも大きな利点です。
-------------------------------
この書籍の説明が一番分かりやすかった。真面目にこの本読もうかしら。。。結構良さげな本なんだけど。
と思ってWebを調べていたら格好の論文発見。「静的単一代入形式最適化システムおよび関連ユーティリティ 外部仕様書」東京工業大学 佐々政孝研究室。これをぺらぺら読み始めた。(P.27/144)なかなか面白い論文だ。
後記
「すごいHaskellたのしく学ぼう!」を読了(P.158/389)