コンパイラ 設計において、静的単一代入形式 (SSA形式 、または単にSSA と略されることが多い)は、各変数に正確に一度だけ 代入される 中間表現 (IR)の一種です。SSAは、 LLVM 、GNUコンパイラコレクション 、および多くの商用コンパイラを含む、命令型言語向けの高品質最適化コンパイラのほとんどで使用されています。
プログラムをSSA形式に変換するための効率的なアルゴリズムが存在します。SSA形式に変換するには、元のIR内の既存の変数をバージョンに分割し、新しい変数は通常、元の名前に添え字を付けて示します。これにより、すべての定義に独自のバージョンが割り当てられます。また、2つの制御フローパスの接合点では、変数の新しいバージョンに代入する追加のステートメントを導入する必要がある場合もあります。SSA形式からマシンコード への変換も効率的です。
SSA(単一構造分析)を用いることで、最適化に必要な多くの分析、例えば使用定義連鎖 の特定などが容易になります。これは、変数の使用箇所を調べる際に、その変数が値を受け取る可能性のある場所が1箇所しかないためです。ほとんどの最適化はSSA形式を維持するように調整できるため、追加の分析なしに最適化を連続して実行できます。SSAベースの最適化は、通常、SSA形式ではない従来の最適化よりも効率的で強力です。
Scheme やML などの関数型言語 コンパイラでは、一般的に継続渡しスタイル (CPS)が使用されます。SSAは、非ローカル制御フローを除いたCPSの適切なサブセットと形式的に等価であるため、一方に基づいて定式化された最適化と変換は、一般的に他方にも適用されます。中間表現としてCPSを使用することは、高階関数や手続き間解析にとってより自然です。また、CPSはcall/cc を容易にエンコードできますが、SSAはできません。[ 1 ]
歴史 SSA は 1980 年代にIBM の複数の研究者によって開発されました。チームの主要メンバーである Kenneth Zadeck は、開発が続く中でブラウン大学に移籍しました。[ 3 ] 1986 年の論文では、変数が単一の静的割り当てを持つように、誕生点、同一性割り当て、変数名の変更が導入されました。[ 4 ] その後の 1987 年のJeanne Ferrante と Ronald Cytronによる論文[ 5 ] では、前の論文で行われた名前の変更により、スカラーのすべての偽の依存関係が削除されることが証明されました。[ 3 ] 1988 年に、Barry Rosen、Mark N. Wegman 、Kenneth Zadeck は同一性割り当てを Φ 関数に置き換え、「静的単一割り当て形式」という名前を導入し、現在では一般的な SSA 最適化を実証しました。[ 6 ] Φ 関数という名前は、Rosen が「偽関数」よりも出版しやすいバージョンとして選びました。[ 3 ] Alpern、Wegman、およびZadeckは別の最適化を発表しましたが、「静的単一代入」という名前を使用しました。[ 7 ] 最後に、1989年にRosen、Wegman、Zadeck、Cytron、およびFerranteは、プログラムをSSA形式に変換する効率的な方法を発見しました。[ 8 ]
利点 SSAの主な利点は、変数のプロパティを簡素化することで、さまざまなコンパイラ最適化 の結果を同時に簡素化し、改善できる点にあります。たとえば、次のコードを考えてみましょう。
y := 1 y := 2 x := y y人間は、最初の代入が不要であること、そして3行目で使用されている値が2番目の代入から来ていることを理解できます。プログラムがこれを判断するには、到達定義分析を y実行する必要があります。しかし、プログラムがSSA形式であれば、これら2つはすぐにわかります。
y 1 := 1 y 2 := 2 x 1 := y 2 SSAの使用によって有効化または大幅に強化されるコンパイラ最適化アルゴリズムには、以下のものが含まれます。
定数畳み込み – 計算をランタイムからコンパイルタイムに変換する。たとえば、命令をa=3*4+5;次のように扱う。a=17;値範囲伝播 [ 9 ] – 計算結果が取り得る範囲を事前に計算し、分岐予測を事前に作成できるようにする。疎な条件付き定数伝播 – 一部の値の範囲チェックを行い、テストが最も可能性の高い分岐を予測できるようにするデッドコードの削除 – 結果に影響を与えないコードを削除しますグローバル値番号付け – 同じ結果を生成する重複した計算を置き換える部分的な冗長性の排除 – プログラムの一部の分岐で以前に実行された重複した計算を削除する強度削減 – コストのかかる演算を、よりコストの低い同等の演算に置き換える。例えば、整数の乗算や除算を、よりコストの低い可能性のある左シフト(乗算の場合)または右シフト(除算の場合)に置き換える。レジスタ割り当て – 限られた数のマシンレジスタを計算に最適化して使用する方法
SSAへの切り替え 通常のコードをSSA形式に変換する主な方法は、各代入のターゲットを新しい変数に置き換え、変数の使用箇所をその時点に到達した 変数の「バージョン」に置き換えることです。例えば、次の制御フローグラフを 考えてみましょう。
SSAへの変換前の制御フローグラフの例 「x」の左側の名前を変更する← {\displaystyle \leftarrow } x - 3" と記述し、 x の以降の使用箇所をその新しい名前に変更しても、プログラムは変更されません。SSA では、x 1 とx 2 という 2 つの新しい変数を作成し、それぞれに一度だけ値を代入することで、この脆弱性を悪用できます。同様に、他のすべての変数に識別用の添え字を付けると、次のようになります。
部分的にSSAに変換された制御フローグラフの例 それぞれの用法がどの定義を参照しているかは明確ですが、例外が1つあります。それは、下部のブロックにあるy の2つの用法が、制御フローがたどった経路に応じて、y 1 またはy 2のどちらかを参照している可能性があるということです。
この問題を解決するために、最後のブロックにΦ(ファイ)関数と呼ばれる特別なステートメントが挿入されます。このステートメントは 、 過去の制御フローに応じてy1 またはy2 のいずれか を 「選択」することで、 y3 と呼ばれる新しいyの定義を生成します。
制御フローグラフの例(SSAに完全変換済み) さて、最後のブロックでは単にy 3 を使用すればよく、どちらの方法でも正しい値が得られます。x の Φ 関数は必要 ありません。この場所に到達するのはxのバージョンが x 2 だけなので、問題はありません (つまり、Φ( x 2 , x 2 )= x 2 です)。
任意の制御フローグラフが与えられた場合、Φ関数をどこに、どの変数に挿入すべきかを判断するのは難しい場合があります。この一般的な問題には、支配境界と 呼ばれる概念を用いて計算できる効率的な解決策があります(下記参照)。
Φ 関数は、ほとんどのマシンではマシン操作として実装されていません。コンパイラは、各先行ブロックの末尾に「移動」操作を挿入することで Φ 関数を実装できます。上記の例では、コンパイラは左中央ブロックの末尾にy 1 からy 3への移動を、右中央ブロックの末尾に y 2から y 3 への移動を挿入する可能性があります。これらの移動操作は、コンパイラのレジスタ割り当て 手順によっては、最終的なコードに含まれない場合があります。ただし、ワイド発行 マシンで発生するような、同時操作が投機的に Φ 関数への入力を生成する場合、この方法は機能しない可能性があります。通常、ワイド発行マシンには、コンパイラが Φ 関数を実装するために使用する選択命令があります。
優位性境界を用いて最小SSAを計算する 制御フローグラフにおいて、ノードAが別のノードBを厳密に支配する とは、Aを経由せずにBに到達することが不可能な場合をいう。言い換えれば、ノードBに到達した場合、Aは実行されたとみなせる。AがBを厳密に支配する場合、またはA = Bである場合、 AはBを支配して いる(またはBはAに支配されている)とされる。
ノードAに制御を移譲するノードは、Aの直前のノードと呼ばれる。
ノードAの支配境界とは 、AがBを厳密には支配しない ものの、Bの直前のノードを支配しているノードBの集合である。これらは、複数の制御パスが再び合流して単一のパスになる地点である。
例えば、以下のコードでは:
[1] x = random() x < 0.5 の場合 [2] 結果 = "表" それ以外 [3] 結果 = "tails" 終わり [4] print(結果) ノード1はノード2、3、4を厳密に支配しており、ノード4の直前のノードはノード2と3である。
支配境界は、Φ 関数が必要となるポイントを定義します。上記の例では、制御がノード 4 に渡される場合、result使用される定義は、制御がノード 2 から渡されたか、ノード 3 から渡されたかによって異なります。支配子で定義された変数には、適用可能な定義が 1 つしかないため、Φ 関数は必要ありません。
各ノードの支配境界を見つけるための効率的なアルゴリズムが存在する。このアルゴリズムは、1991年にRon Cytron、Jeanne Ferranteらが発表した「Efficiently Computing Static Single Assignment Form and the Control Graph」で初めて説明された。[ 10 ]
ライス大学 のキース・D・クーパー、ティモシー・J・ハーベイ、ケン・ケネディは、「シンプルで高速な支配アルゴリズム」 というタイトルの論文でアルゴリズムについて説明しています。[ 11 ]
各 ノードbについて 支配領域(b) := {} 各 ノード b について、 b の直前のノードの数が 2 以上 の場合 、 b の直前のノードの 各 pについて ランナー := p while runner ≠ idom(b) dominance_frontier(runner) := dominance_frontier(runner) ∪ { b } runner := idom(runner)上記のコードでは、idom(b)はb の直接の支配ノード であり、b を厳密に支配する唯一のノードですが、b を厳密に支配する他のどのノードも厳密に支配しません。
Φ関数の数を減らすバリエーション「最小限」SSAは、各名前に値が一度だけ割り当てられ、元のプログラムにおける名前の各参照(使用)が一意の名前を参照できることを保証するために必要な最小限のΦ関数を挿入します。(後者の要件は、コンパイラが各演算の各オペランドに名前を書き込めるようにするために必要です。)
しかし、これらのΦ関数の中には不要なもの もあるかもしれません。そのため、最小限のSSAは、特定の手順に必要なΦ関数を必ずしも最小限に抑えるとは限りません。分析の種類によっては、これらのΦ関数は不要であり、分析の効率を低下させる可能性があります。
剪定されたSSA 剪定されたSSA形式は、単純な観察に基づいています。Φ関数は、Φ関数の後で「有効」な変数にのみ必要です。(ここで「有効」とは、その値が問題のΦ関数から始まる何らかのパスに沿って使用されることを意味します。)変数が有効でない場合、Φ関数の結果は使用できず、Φ関数による代入は無効になります。
剪定されたSSA形式の構築では、 Φ関数挿入フェーズで有効変数情報 を使用して、特定のΦ関数が必要かどうかを判断します。元の変数名がΦ関数挿入時点で有効でない場合、Φ関数は挿入されません。
別の方法として、枝刈りをデッドコード除去 問題として扱う方法があります。この場合、Φ関数は、入力プログラム内のいずれかの用例がその関数に書き換えられる場合、または別のΦ関数の引数として使用される場合にのみ有効となります。SSA形式に入力する際、各用例は、その用例を支配する最も近い定義に書き換えられます。したがって、Φ関数は、少なくとも1つの用例を支配する最も近い定義であるか、有効なΦ関数の少なくとも1つの引数を支配する定義である限り、有効とみなされます。
半剪定SSA 半剪定SSA形式[ 12 ] は、生存変数情報を計算する比較的高いコストをかけずにΦ関数の数を減らす試みです。これは、変数が基本ブロックに入るときに生存しない場合、Φ関数は必要ないという観察に基づいています。SSA構築中は、「ブロックローカル」変数のΦ関数は省略されます。
ブロックローカル変数のセットを計算する手順は、完全なライブ変数解析よりも簡単で高速であるため、半剪定SSA形式は剪定SSA形式よりも計算効率が高くなります。一方、半剪定SSA形式にはより多くのΦ関数が含まれます。
ブロック引数 ブロック引数は、表現上は同じですが、最適化の際に実際にはより便利な Φ 関数の代替手段です。ブロックには名前が付けられ、関数パラメータとして表記されるブロック引数のリストを受け取ります。ブロックを呼び出すと、ブロック引数は指定された値にバインドされます。MLton 、Swift SIL、およびMLIR は ブロック引数を使用します。[ 13 ] ブロック引数により、 継続渡しスタイル (CPS) との関連性がより明確になります。基本ブロックは関数であり、関数変数はブロック引数 (Φ 関数) です。
SSA形式は通常、直接実行には使用されません(ただし、SSAを解釈することは可能です[ 14 ] )。SSA形式は、直接対応関係にある別のIRの「上」で使用されることがよくあります。これは、既存のIRの各部分(基本ブロック、命令、オペランドなど )とSSAの対応部分との間のマッピングを行う関数セットとしてSSAを「構築」することで実現できます。SSA形式が不要になった場合、これらのマッピング関数は破棄され、最適化されたIRのみが残ります。
SSA 形式で最適化を実行すると、通常は絡み合った SSA-Web が発生します。これは、オペランドがすべて同じルート オペランドを持たない Φ 命令が存在することを意味します。このような場合、カラーアウト アルゴリズムを使用して SSA から抜け出します。単純なアルゴリズムでは、Φ の宛先とは異なるルート シンボルのソースが Φ に格納される原因となった各先行パスに沿ってコピーが導入されます。コピー数を減らして SSA から抜け出すためのアルゴリズムは複数あり、そのほとんどは干渉グラフまたはその近似を使用してコピーの統合を行います。[ 15 ]
拡張機能 SSAフォームの拡張は、2つのカテゴリーに分けられます。
命名規則の 拡張では、命名基準が変更されます。SSA形式では、各変数に値が割り当てられるたびに名前が変更されることを思い出してください。代替案としては、静的単一使用形式(使用されるたびにステートメントごとに各変数の名前が変更される)と静的単一情報形式(値が割り当てられる時と、支配境界後の時点で各変数の名前が変更される)があります。
機能固有の 拡張機能は、変数の単一代入特性を維持しつつ、追加機能をモデル化するための新しいセマンティクスを組み込んでいます。機能固有の拡張機能の中には、配列、オブジェクト、エイリアス付きポインタなどの高レベルプログラミング言語機能をモデル化するものがあります。また、投機や述語化などの低レベルのアーキテクチャ機能をモデル化する機能固有の拡張機能もあります。
研究と放棄 ETH Oberon-2 コンパイラは、SSAの派生版である「GSA」を組み込んだ最初の公開プロジェクトの一つだった。 Open64コンパイラは、グローバルスカラー最適化においてSSA形式を使用していますが、コードは最適化前にSSA形式に変換され、最適化後にSSA形式から元の形式に戻されます。Open64は、 SSA形式の拡張機能を使用して、メモリだけでなくスカラー値もSSA形式で表現します。 2002年、研究者たちはIBMのJikesRVM(当時はJalapeñoという名称だった)を改良し、標準Javaバイトコード と型安全なSSA(SafeTSA )バイトコードクラスファイルの両方を実行できるようにした。そして、SSAバイトコードを使用することでパフォーマンスが大幅に向上することを実証した。 jackccは、学術用命令セットJackal 3.0用のオープンソースコンパイラです。中間表現には、SSAを用いたシンプルな3オペランドコードを使用します。興味深いバリエーションとして、Φ関数をSAME命令と呼ばれる命令に置き換えています。この命令は、レジスタ割り当て器に対し、2つの有効範囲を同じ物理レジスタに配置するよう指示します。 1994 年頃のイリノイコンサートコンパイラ[ 37 ] は、SSA のバリアントである SSU (Static Single Use) を使用していました。これは、各変数に値が割り当てられるとき、およびその変数が使用される各条件コンテキストで、各変数の名前を変更します。これは基本的に、前述の静的単一情報形式です。SSU 形式は、ジョン・プレヴィアクの博士論文に記載されています。 COINSコンパイラは、ここで説明されているようにSSA形式最適化を使用します。 Reservoir LabsのR-Streamコンパイラは、非SSA(クワッドリスト)、SSA、およびSSI(Static Single Information [ 38 ] )形式をサポートしています。[ 39 ] Boomerangの逆コンパイラはコンパイラではありませんが、内部表現にSSA形式を使用しています。SSAは、式の伝播の簡素化、パラメータと戻り値の識別、保存性分析などに利用されます。 DotGNU Portable.NETは、JITコンパイラにSSAを使用していた。
参考文献
注記 ↑ Kelsey, Richard A. (1995). 「継続渡しスタイルと静的単一代入形式の対応関係」(PDF) . 1995年ACM SIGPLAN中間表現ワークショップ論文集 . pp. 13–22 . doi : 10.1145/202529.202532 . ISBN 0897917545 . S2CID 6207179 . 1 2 3 Zadeck, Kenneth (2009 年 4 月). 静的単一課題フォームの開発 (PDF) . 静的単一課題フォームセミナー . フランス、オートラン。 ↑ Cytron, Ron; Lowry, Andy; Zadeck, F. Kenneth (1986). "高水準言語における制御構造のコード移動". 第 13 回 ACM SIGACT-SIGPLAN プログラミング言語の原理に関するシンポジウム - POPL '86 の議事録 。pp . 70–85。doi : 10.1145 / 512644.512651。S2CID 9099471 。 ↑ Cytron, Ronald Kaplan; Ferrante, Jeanne. 名前には何の意味があるのか?あるいは、並列処理の検出とストレージ割り当てにおける名前変更の価値 。国際並列処理会議、ICPP'87 1987年。pp. 19–27 。 ↑ Barry Rosen; Mark N. Wegman; F. Kenneth Zadeck (1988). "グローバル値と冗長計算" (PDF) . 第 15 回 ACM SIGPLAN-SIGACT プログラミング言語の原理に関するシンポジウム - POPL '88 の議事録 。pp. 12–27 . doi : 10.1145/73560.73562 . ISBN 0-89791-252-7 。↑ Alpern, B.; Wegman, MN; Zadeck, FK (1988). "プログラムにおける変数の等価性の検出". 第15回 ACM SIGPLAN-SIGACT プログラミング言語の原理に関するシンポジウム - POPL '88 議事録 . pp. 1–11 . doi : 10.1145/73560.73561 . ISBN 0897912527 . S2CID 18384941 . ↑ Cytron, Ron; Ferrante, Jeanne; Rosen, Barry K.; Wegman, Mark N. & Zadeck, F. Kenneth (1991). "Efficiently computing static single assignment form and the control dependence graph" (PDF) . ACM Transactions on Programming Languages and Systems . 13 (4): 451– 490. CiteSeerX 10.1.1.100.6361 . doi : 10.1145/115372.115320 . S2CID 13243943 . ↑ 値範囲の伝播 ↑ Cytron, Ron; Ferrante, Jeanne; Rosen, Barry K.; Wegman, Mark N.; Zadeck, F. Kenneth (1991 年 10 月 1 日). "Efficiently computing static single assignment form and the control dependence graph" . ACM Transactions on Programming Languages and Systems . 13 (4): 451–490 . doi : 10.1145/115372.115320 . S2CID 13243943 . ↑ Cooper, Keith D.; Harvey, Timothy J.; Kennedy, Ken (2001). シンプルで高速な優位性アルゴリズム (PDF) (技術報告書). ライス大学、CS技術報告書 06-33870。2022年3月26日に オリジナル (PDF) からアーカイブされました 。 ↑ Briggs, Preston; Cooper, Keith D.; Harvey, Timothy J.; Simpson, L. Taylor (1998). Practical Improvements to the Construction and Destruction of Static Single Assignment Form (PDF) (Technical report). Archived from the original (PDF) on 2010-06-07. ↑ 「ブロック引数とPHIノード - MLIRの根拠」 。mlir.llvm.org 。 2022年 3月4日 取得 。 ↑ von Ronne, Jeffery; Ning Wang; Michael Franz (2004). "静的単一代入形式でのプログラムの解釈" . 2004年ワークショップ「インタプリタ、仮想マシン、エミュレータ - IVME '04」論文集 . p. 23. doi : 10.1145/1059579.1059585 . ISBN 1581139098 . S2CID 451410 . ↑ ボワシノ、ブノワ。ダルテ、アラン。ラステッロ、ファブリス。ディネシン、ブノワ・デュポン・ド。ギヨン、クリストフ (2008)。 「正確性、コード品質、効率性を高めるための SSA 外部変換の再検討」 。 HAL-インリア Cs.DS : 14. ↑ 「WebKit FTL JIT の紹介」 。2014 年 5 月 13 日。 ↑ 「B3 JITコンパイラの紹介」 。2016年2月15日。 ↑ "Swift Intermediate Language (GitHub)" . GitHub . 2021年10月30日。 ↑ "SwiftのハイレベルIR:言語固有の最適化でLLVM IRを補完するケーススタディ、LLVM開発者ミートアップ 2015年10月" . YouTube . 2015年11月9日 。2021年12月21日にオリジナルから アーカイブされました。 ↑ 「OTP 22.0 リリースノート 」 ↑ 「Go 1.7 リリースノート - Go プログラミング言語」 . golang.org . 2016年8月17日 取得 。 ↑ 「Go 1.8 リリースノート - Go プログラミング言語」 . golang.org . 2017年2月17日 取得 。 ↑ 「IonMonkeyの概要 」 、↑ アートの進化 - Google I/O 2016。Google 。 2016年5月25日。 イベントは3分47秒に発生します。 ↑ ニーラジャ、ラマナン (2011 年 12 月 12 日)。 「時代を超えたJIT」 (PDF) 。 ↑ 「バイトコード最適化」 。LuaJITプロジェクト。 ↑ "HipHop Intermediate Representation (HHIR)" . GitHub . 2021年10月30日。 ↑ Chambart, Pierre; Laviron, Vincent; Pinto, Dario (2024-03-18). "OCaml 最適化コンパイラの舞台裏" . OCaml Pro . ↑ 「企業 - 最適化と機械語生成」 。 ↑ ジェイソン、エクストランド(2014年12月16日)。 「メサの新しいIRであるNIRの再導入」 。 ↑ 「Java HotSpot Performance Engine Architecture」 。Oracle Corporation。 ↑ 「新しい高度なVisual C++コード最適化ツールのご紹介」 。2016年5月4日。 ↑ 「SPIR-V仕様書」 (PDF ) ↑ 「DirectX 中間言語」 。マイクロソフト。 ↑ Sarkar, V. (1997 年 5 月). 「IBM XL FORTRAN コンパイラにおける高階変換の自動選択」 (PDF) . IBM Journal of Research and Development . 41 (3). IBM: 233– 264. doi : 10.1147/rd.413.0233 . ↑ Chakrabarti, Gautam; Grover, Vinod; Aarts, Bastiaan; Kong, Xiangyun; Kudlur, Manjunath; Lin, Yuan; Marathe, Jaydeep; Murphy, Mike; Wang, Jian-Zhong (2012). "CUDA: GPUプラットフォーム向けコンパイルと最適化" . Procedia Computer Science . 9 : 1910– 1919. doi : 10.1016/j.procs.2012.04.209 . ↑ 「イリノイ・コンサート・プロジェクト」 。2014年3月13日に オリジナル からアーカイブされました 。 ↑ Ananian, C. Scott; Rinard, Martin (1999). 静的単一情報フォーム (PDF) (技術報告書). CiteSeerX 10.1.1.1.9976 . ↑ 並列コンピューティング百科事典 。
一般的な参考文献 ラステッロ、ファブリス。ティシャドゥ、フローラン・ブーシェズ編。 (2022年)。SSA ベースのコンパイラ設計 (PDF) 。チャム。土井 : 10.1007/978-3-030-80515-9。ISBN 978-3-030-80515-9 . S2CID 63274602 . {{cite book}}: CS1メンテナンス: 場所の発行元が見つかりません (リンク)Appel, Andrew W. (1999). MLにおける最新のコンパイラ実装 . Cambridge University Press. ISBN 978-0-521-58274-2 。 Java 版もございます(ISBN 0-521-82060-X (2002年)およびC (ISBN 0-521-60765-5 (1998年版)。クーパー、キース・D. & トルツォン、リンダ (2003).コンパイラのエンジニアリング . モーガン・カウフマン. ISBN 978-1-55860-698-2 。 ムチニック、スティーブン・S. (1997).高度なコンパイラ設計と実装 . モーガン・カウフマン. ISBN 978-1-55860-320-2 。 Kelsey, Richard A. (1995 年 3 月). 「継続パス方式と静的単一代入方式の対応関係」 . ACM SIGPLAN Notices . 30 (3): 13–22 . doi : 10.1145/202530.202532 . Appel, Andrew W. (1998年4月). "SSAは関数型プログラミングである" . ACM SIGPLAN Notices . 33 (4): 17– 20. doi : 10.1145/278283.278285 . S2CID 207227209 . Pop, Sebastian (2006). SSA表現フレームワーク:意味論、分析、およびGCC実装 (博士論文)。パリ鉱業学校 。 Matthias Braun、Sebastian Buchwald、Sebastian Hack、Roland Leißa、Christoph Mallon、Andreas Zwinkau (2013)、「静的単一代入形式のシンプルかつ効率的な構築」、Compiler Construction 、Lecture Notes in Computer Science、vol. 7791、Springer Berlin Heidelberg、pp. 102–122 、doi : 10.1007/978-3-642-37051-9_6 、ISBN 978-3-642-37050-2 2013年3月24日 取得
外部リンク スティーブン・ボッシャー、ディエゴ・ノビロ。「GCCに新しいオプティマイザフレームワークが実装される」。GCCのSSAの使用と、それが従来のIRよりもどのように改善されているかについての記事。 SSA文献目録。SSA研究論文の包括的なカタログ。 ザデック、F.ケネス。「静的単一割り当てフォームの開発」、2007年12月のSSAの起源に関する講演。