コンパイラ設計において、静的単一代入形式(SSA形式または単にSSAと略されることが多い)は、各変数が正確に1回だけ代入される中間表現(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 氏は、開発の継続に伴いブラウン大学に移りました。[ 2 ] [ 3 ] 1986 年の論文では、誕生点、恒等代入、および変数名の変更が導入され、変数には単一の静的代入が行われました。[ 4 ] 1987 年のJeanne Ferrante 氏と Ronald Cytron 氏による後続の論文[ 5 ]では、前の論文で行われた名前の変更によってスカラーのすべての誤った依存関係が削除されることが証明されました。[ 3 ] 1988 年、 Barry Rosen 氏、Mark N. Wegman氏、および Kenneth Zadeck 氏は恒等代入を Φ 関数に置き換え、「静的単一代入形式」という名前を導入し、現在では一般的な SSA 最適化を実証しました。[ 6 ] Φ 関数という名前は、Rosen 氏が「偽関数」の出版しやすいバージョンとして選びました。[ 3 ]アルパーン、ウェグマン、ザデックは別の最適化手法を提示したが、ここでは「静的単一代入」という名前が使われていた。[ 7 ]最終的に、1989年にローゼン、ウェグマン、ザデック、サイトロン、フェランテはプログラムをSSA形式に変換する効率的な方法を発見した。[ 8 ]
利点
SSAの主な有用性は、変数の特性を簡素化することで、さまざまなコンパイラ最適化の結果を同時に簡素化し、改善する方法にあります。例えば、次のコードを考えてみましょう
y := 1 y := 2 x := y
人間は最初の代入は不要であり、y3行目で使用されている の値は の2番目の代入から来ていることがわかります。プログラムはこれを判断するために到達定義分析yを実行する必要があります。しかし、プログラムがSSA形式の場合、これらはどちらも即時です
y 1 := 1 y 2 := 2 x 1 := y 2
SSA の使用によって有効化または大幅に強化される コンパイラ最適化アルゴリズムには次のものがあります。
- 定数畳み込み– 実行時計算からコンパイル時計算への変換。例えば、命令を
a=3*4+5;次のように扱う。a=17; - 値の範囲伝播[ 9 ] – 計算の可能性のある範囲を事前に計算し、事前に分岐予測を作成できるようにする
- 疎な条件付き定数伝播– いくつかの値の範囲チェックにより、最も可能性の高い分岐を予測するテストが可能
- デッドコードの除去– 結果に影響を与えないコードを削除する
- グローバル値の番号付け- 同じ結果を生成する重複した計算を置き換えます
- 部分的な冗長性の除去– プログラムのいくつかの分岐で以前に実行された重複計算を削除します
- 強度の削減– 高価な操作をより安価で同等の操作に置き換えます。たとえば、整数の乗算または 2 の累乗による除算を、より安価になる可能性のある左シフト (乗算の場合) または右シフト (除算の場合) に置き換えます。
- レジスタ割り当て– 限られた数のマシンレジスタを計算にどのように使用するかを最適化する
SSAへの変換
通常のコードをSSA形式に変換するには、主に、各代入の対象を新しい変数に置き換え、変数の使用をその時点までの変数の「バージョン」に置き換える必要があります。例えば、次の制御フローグラフを考えてみましょう

「x x - 3」の左辺の名前を変更し、その後のxの使用箇所をその新しい名前に変更しても、プログラムは変更されません。SSAでは、 x 1とx 2という2つの新しい変数を作成し、それぞれに1回だけ代入することで、この動作を利用できます。同様に、他のすべての変数に区別する添え字を付けることにより、以下のようになります。

1 つの例外を除いて、それぞれの使用がどの定義を参照しているかは明らかです。下のブロックでのyの使用は両方とも、制御フローがたどったパスに応じて、 y 1またはy 2 のいずれかを参照している可能性があります。
これを解決するため、最後のブロックにΦ (Phi) 関数と呼ばれる特別なステートメントが挿入されます。このステートメントは、過去の制御フローに応じて y 1またはy 2のいずれかを「選択」し、 y 3と呼ばれるyの新しい定義を生成します。

これで、最後のブロックでは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 つのパスに再び結合されるポイントです。
たとえば、次のコードでは:
[1] x = ランダム() x < 0.5の場合 [2] 結果 = "表" そうでない場合 [3] result = "表" 終了 [4] print(result)
ノード 1 は 2、3、4 を厳密に支配し、ノード 4 の直前のノードはノード 2 と 3 です。
ドミナンス・フロンティアは、Φ関数が必要となるポイントを定義します。上記の例では、制御がノード4に渡されるとき、result使用される定義は、制御がノード2から渡されたか、ノード3から渡されたかによって異なります。ドミネーターで定義された変数には、適用可能な定義が1つしかないため、Φ関数は必要ありません。
各ノードの支配境界を求める効率的なアルゴリズムがあります。このアルゴリズムは、1991年にロン・サイトロン、ジャンヌ・フェランテらによって「静的単一割り当て形式と制御グラフの効率的な計算」で初めて説明されました。[ 10 ]
ライス大学のキース・D・クーパー、ティモシー・J・ハーベイ、ケン・ケネディは、「シンプルで高速な優位性アルゴリズム」と題した論文の中でアルゴリズムを説明しています。[ 11 ]
各ノードbについて ドミナンス・フロンティア(b) := {} 各ノードb について、bの直前のノードの数≥2 の場合、bの直前のノードの各pについて ランナー := p ランナー≠ idom(b)である間 支配フロンティア(ランナー) := 支配フロンティア(ランナー) ∪ { b } ランナー := idom(ランナー) 上記のコードでは、idom(b)はb の直接の支配ノードであり、b を厳密に支配する唯一のノードですが、b を厳密に支配する他のどのノードも厳密に支配しません。
Φ関数の数を減らすバリエーション
「最小限」SSAは、各名前に値が1回だけ割り当てられ、元のプログラム内の名前の各参照(使用)が依然として一意の名前を参照できることを保証するために必要な、最小限の数のΦ関数を挿入します。(後者の要件は、コンパイラが各操作の各オペランドに名前を書き込むことができることを保証するために必要です。)
しかし、これらのΦ関数の中には不要なものもある可能性があります。そのため、最小SSAでは、必ずしも特定の手順に必要なΦ関数が最小限に抑えられるわけではありません。分析の種類によっては、これらのΦ関数は不要であり、分析の効率を低下させる可能性があります。
プルーニングSSA
プルーニングSSA形式は、単純な観察に基づいています。Φ関数は、Φ関数の後に「ライブ」である変数にのみ必要です。(ここで「ライブ」とは、値が問題のΦ関数から始まる何らかのパスに沿って使用されることを意味します。)変数がライブでない場合、Φ関数の結果は使用できず、Φ関数による代入は無効です
プルーニングされたSSA形式の構築では、 Φ関数挿入フェーズでライブ変数情報を使用して、特定のΦ関数が必要かどうかを判断します。元の変数名がΦ関数挿入ポイントでライブでない場合、Φ関数は挿入されません。
もう一つの可能性は、プルーニングをデッドコード除去問題として扱うことです。この場合、Φ関数は、入力プログラム内での使用が書き換えられるか、別のΦ関数の引数として使用される場合にのみ、有効となります。SSA形式を入力する際、各使用は、それを支配する最も近い定義に書き換えられます。つまり、有効なΦ関数の少なくとも1つの使用、または少なくとも1つの引数を支配する最も近い定義である限り、Φ関数は有効であるとみなされます。
セミプルーニングSSA
セミプルーニングSSA形式[ 12 ]は、ライブ変数情報の計算にかかる比較的高いコストを負担することなく、Φ関数の数を削減する試みです。これは、変数が基本ブロックに入る際にライブでない場合、Φ関数を必要としないという観察に基づいています。SSAの構築中、ブロックローカル変数のΦ関数は省略されます
ブロックローカル変数の集合を計算する手順は、完全なライブ変数解析よりも単純かつ高速であるため、セミプルーニングSSA形式はプルーニングSSA形式よりも計算効率が高くなります。一方で、セミプルーニングSSA形式にはより多くのΦ関数が含まれます。
ブロック引数
ブロック引数はΦ関数の代替手段であり、表現上は同じですが、実際には最適化時に便利です。ブロックには名前が付けられ、関数のパラメータとして表記されるブロック引数のリストを取ります。ブロックを呼び出すと、ブロック引数は指定された値にバインドされます。MLton 、 Swift SIL、LLVM MLIRはブロック引数を使用します。[ 13 ]
SSAフォームからの変換
SSA形式は通常、直接実行には使用されません(ただし、SSA [ 14 ]を解釈することは可能です)。SSAは、直接対応する別のIRの「上」で使用されることがよくあります。これは、SSAを、既存のIR(基本ブロック、命令、オペランドなど)とそのSSA対応部分との間のマッピングを行う関数セットとして「構築」することで実現できます。SSA形式が不要になった場合、これらのマッピング関数は破棄され、最適化されたIRのみが残ります。
SSA形式に対して最適化を行うと、通常、SSA-Webが絡み合うことになります。つまり、Φ命令のオペランドのルートオペランドがすべて同じではないという状況です。このような場合、カラーアウトアルゴリズムを用いてSSAから抜け出します。ナイーブなアルゴリズムでは、各先行パスにコピーが導入され、Φの宛先とは異なるルートシンボルのソースがΦに配置されることになります。コピー数を減らしてSSAから抜け出すアルゴリズムは複数存在し、そのほとんどは干渉グラフまたはその近似値を用いてコピーの統合を行います。[ 15 ]
拡張
SSAフォームの拡張は2つのカテゴリに分けられます
名前変更スキームの拡張は、名前変更の基準を変更します。SSA形式は、各変数に値が代入される際に名前を変更することを思い出してください。代替スキームとしては、静的単一使用形式(各文が使用される際に各変数の名前を変更する)と静的単一情報形式(各変数に値が代入される際と、後優勢境界で名前を変更する)があります。
機能固有の拡張機能は、変数の単一代入特性を維持しつつ、追加機能をモデル化するための新しいセマンティクスを組み込んでいます。一部の機能固有の拡張機能は、配列、オブジェクト、エイリアスポインタといった高水準プログラミング言語機能をモデル化します。また、他の機能固有の拡張機能は、投機的処理や述語処理といった低水準アーキテクチャ機能をモデル化します。
SSA形式を使用するコンパイラ
オープンソース
- MonoはMiniと呼ばれるJITコンパイラでSSAを使用しています
- WebKitはJITコンパイラでSSAを使用しています。[ 16 ] [ 17 ]
- SwiftはLLVM IRの上に独自のSSA形式を定義しており、SIL(Swift Intermediate Language)と呼ばれています。[ 18 ] [ 19 ]
- ErlangコンパイラはOTP 22.0で書き直され、「静的単一代入(SSA)に基づく中間表現を内部的に使用する」ようになり、将来のリリースではSSA上にさらなる最適化が組み込まれる予定です。[ 20 ]
- LLVMコンパイラインフラストラクチャは、主要なコード表現において、すべてのスカラーレジスタ値(メモリを除くすべて)にSSA形式を使用します。SSA形式は、コンパイルプロセスの後半(多くの場合、リンク時)でレジスタ割り当てが行われるまで削除されません。
- GNUコンパイラコレクション(GCC)は、バージョン4(2005年4月リリース)以降、SSAを広範に活用しています。フロントエンドは「GENERIC 」コードを生成し、「gimplifier」によって「 GIMPLE 」コードに変換されます。SSA形式の「GIMPLE」には、高レベルの最適化が適用されます。結果として得られる最適化された中間コードは、 RTLに変換され、低レベルの最適化が適用されます。アーキテクチャ固有のバックエンドは、最終的にRTLをアセンブリ言語に変換します。
- Go(1.7:x86-64アーキテクチャのみ、1.8:サポートされているすべてのアーキテクチャ)。[ 21 ] [ 22 ]
- IBMのオープンソース適応型Java仮想マシンであるJikes RVMは、SSAの拡張である拡張配列SSAを使用しています。これは、統一されたフレームワークでスカラー、配列、およびオブジェクトフィールドの解析を可能にするものです。拡張配列SSA解析は、コードの中で最も頻繁に実行される部分に適用され、最大最適化レベルでのみ有効になります。
- Mozilla FirefoxのSpiderMonkey JavaScriptエンジンはSSAベースのIRを使用しています。[ 23 ]
- Chromium V8 JavaScriptエンジンは、2010年12月に発表されたように、CrankshaftコンパイラインフラストラクチャにSSAを実装しています。
- PyPy は、JIT コンパイラーのトレースに線形 SSA 表現を使用します。
- Androidランタイム[ 24 ]とDalvik仮想マシンはSSAを使用しています。[ 25 ]
- 標準 ML コンパイラMLton は、中間言語の 1 つで SSA を使用します。
- LuaJITはSSAベースの最適化を多用する。[ 26 ]
- PHPとHackコンパイラHHVMはIRでSSAを使用しています。[ 27 ]
- OCamlコンパイラはCMM IR(C--の略)でSSAを使用します。[ 28 ]
- コンパイラのミドルエンドおよびバックエンドとして使用されるライブラリであるlibFirmは、SSA対応レジスタアロケータを使用してコードが生成されるまで、すべてのスカラーレジスタ値にSSA形式を使用します。[ 29 ]
- シェーディング言語のSSA表現であるNIRを介した様々なMesaドライバ。 [ 30 ]
商用
- OracleのHotSpot Java仮想マシンは、 JITコンパイラでSSAベースの中間言語を使用しています。[ 31 ]
- Microsoft Visual Studio 2015 Update 3で利用可能なMicrosoft Visual C++コンパイラバックエンドはSSAを使用しています[ 32 ]
- SPIR-Vは、 VulkanグラフィックスAPIのシェーディング言語標準であり、OpenCLコンピューティングAPIのカーネル言語であり、SSA表現です。[ 33 ]
- IBMファミリーのXLコンパイラーにはC、C++、Fortranが含まれています。[ 34 ]
- NVIDIA CUDA [ 35 ]
研究と放棄
- ETH Oberon-2コンパイラは、SSA の変種である「GSA」を組み込んだ最初のパブリック プロジェクトの 1 つです。
- Open64コンパイラは、グローバルスカラーオプティマイザでSSA形式を使用していますが、コードは事前にSSA形式に変換され、その後SSA形式から取り出されます。Open64は、SSA形式の拡張を使用して、メモリをスカラー値だけでなくSSA形式でも表現します。
- 2002 年、研究者らはIBM の JikesRVM (当時は Jalapeño という名前でした) を、標準 Javaバイトコードとタイプセーフ SSA ( SafeTSA ) バイトコード クラス ファイルの両方を実行できるように変更し、SSA バイトコードの使用によるパフォーマンス上の大きな利点を実証しました。
- jackccは、アカデミック命令セットJackal 3.0用のオープンソースコンパイラです。中間表現にはSSAを用いたシンプルな3オペランドコードを使用します。興味深いバリエーションとして、Φ関数をいわゆるSAME命令に置き換えています。SAME命令は、レジスタアロケータに2つの有効な範囲を同じ物理レジスタに配置するよう指示します。
- 1994年頃のイリノイ・コンサート・コンパイラ[ 36 ]は、SSAの変種であるSSU(Static Single Use)を採用していました。これは、各変数に値が代入される際、およびその変数が使用される条件付きコンテキストごとに変数名を変更します。これは本質的に、前述の静的単一情報形式です。SSU形式については、ジョン・プレヴィヤックの博士論文に記載されています。
- COINS コンパイラーは、ここで説明されているように、SSA 形式の最適化を使用します。
- Reservoir LabsのR-Streamコンパイラは、非SSA(クワッドリスト)、SSA、およびSSI(静的単一情報[ 37 ])形式をサポートしています。[ 38 ]
- Boomerangデコンパイラはコンパイラではありませんが、内部表現にSSA形式を使用します。SSAは、式の伝播、パラメータと戻り値の識別、保存分析などを簡素化するために使用されます。
- DotGNU Portable.NET は JIT コンパイラで SSA を使用しました。
参考文献
注記
- ^ケルシー、リチャード A. (1995). 「継続渡しスタイルと静的単一代入形式の対応」(PDF) . 1995年ACM SIGPLAN中間表現ワークショップ論文. pp. 13– 22. doi : 10.1145/202529.202532 . ISBN 0897917545. S2CID 6207179 .
- ^ Rastello & Tichadou 2022、1.4節
- ^ a b cザデック、ケネス(2009年4月)「静的単一割り当てフォームの開発」(PDF)静的単一割り当てフォームセミナー、オートランス、フランス。
- ^ Cytron, Ron; Lowry, Andy; Zadeck, F. Kenneth (1986). 「高水準言語における制御構造のコード移動」. Proceedings of the 13th ACM SIGACT-SIGPLAN symposium on Principles of programming languages - POPL '86 . pp. 70– 85. doi : 10.1145/512644.512651 . S2CID 9099471 .
- ^ Cytron, Ronald Kaplan; Ferrante, Jeanne. 「名前の意味とは? あるいは、並列処理の検出と記憶域割り当てにおける名前変更の価値」国際並列処理会議、ICPP'87 1987. pp. 19– 27.
- ^バリー・ローゼン、マーク・N・ウェグマン、F・ケネス・ザデック (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). 「静的単一代入形式と制御依存グラフの効率的な計算」(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日). 「静的単一代入形式と制御依存グラフの効率的な計算」 . 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.オリジナル(PDF)から2022年3月26日にアーカイブ。
- ^ Briggs, Preston; Cooper, Keith D.; Harvey, Timothy J.; Simpson, L. Taylor (1998).静的単一代入フォームの構築と破棄に関する実用的な改善(PDF) (技術レポート). 2010年6月7日時点のオリジナル(PDF)からのアーカイブ。
- ^ 「ブロック引数と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 .
- ^ Boissinot, Benoit; Darte, Alain; Rastello, Fabrice; Dinechin, Benoît Dupont de; Guillon, Christophe (2008). 「正確性、コード品質、効率性のためのSSA外変換の再検討」 HAL -Inria 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 の概要」。、
- ^ ARTの進化 - 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 パフォーマンス エンジン アーキテクチャ」。Oracle Corporation。
- ^ 「新しい高度なVisual C++コードオプティマイザーの紹介」 2016年5月4日。
- ^ 「SPIR-V仕様」(PDF) .
- ^ 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) . Cham. doi : 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。
- リチャード・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 .
- ポップ、セバスチャン (2006). SSA表現フレームワーク:意味論、分析、GCC実装(博士論文).パリ鉱山学校.
- Matthias Braun、Sebastian Buchwald、Sebastian Hack、Roland Leißa、Christoph Mallon、Andreas Zwinkau (2013)、「静的単一代入形式の単純かつ効率的な構築」、コンパイラ構築、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-22013年3月24日閲覧
外部リンク
- Bosscher, Steven、Novillo, Diego。GCCに新しいオプティマイザフレームワークが追加。GCCにおけるSSAの使用と、それが従来のIRと比べてどのように改善されているかについての記事。
- SSA書誌。SSA研究論文の広範なカタログ。
- Zadeck, F. Kenneth. 「静的単一割り当て形式の開発」、2007年12月、SSAの起源に関する講演。