[インデックス 11417] ファイルの概要
このコミットは、Goコンパイラのインライン化(inlining)の基準を緩和し、より多くの関数がインライン化されるように変更を加えるものです。これにより、コンパイルされたコードのパフォーマンス向上が期待されます。具体的には、関数の「複雑さ(hairyness)」を評価するロジックが調整され、インライン化の予算(budget)が導入されました。
コミット
commit 93e547a0c2aec056027558bca5dcfa706d9f6eda
Author: Luuk van Dijk <lvd@golang.org>
Date: Thu Jan 26 17:20:48 2012 +0100
gc: softer criteria for inlinability.
R=rsc
CC=golang-dev
https://golang.org/cl/5555072
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/93e547a0c2aec056027558bca5dcfa706d9f6eda
元コミット内容
gc: softer criteria for inlinability.
R=rsc
CC=golang-dev
https://golang.org/cl/5555072
変更の背景
Goコンパイラにおける関数インライン化は、プログラムの実行速度を向上させるための重要な最適化手法です。インライン化とは、関数呼び出しのオーバーヘッドを削減し、呼び出し元の関数内で呼び出される関数の本体を直接展開することで、さらなる最適化の機会を増やす技術です。しかし、過度なインライン化はバイナリサイズの増大やコンパイル時間の増加を招く可能性があります。
このコミット以前のGoコンパイラ(gc
)では、関数のインライン化に関する基準が厳しすぎたため、インライン化できるはずの関数がインライン化されず、パフォーマンスの機会が失われている可能性がありました。特に、関数の「複雑さ(hairyness)」を判断するロジックが単純すぎたため、わずかに複雑な関数でもインライン化の対象から外れていました。
この変更の背景には、より多くの関数をインライン化できるようにインライン化の基準を緩和し、全体的なパフォーマンスを向上させたいという意図があります。特に、単一のステートメントを持つ関数や、特定の種類のASTノードを持つ関数に対する制限が厳しすぎたため、それらの制限を緩和することが目的でした。
前提知識の解説
- 関数インライン化 (Function Inlining): コンパイラ最適化の一種で、関数呼び出しをその関数の本体のコードで置き換えること。これにより、関数呼び出しのオーバーヘッド(スタックフレームのセットアップ、レジスタの保存・復元など)が削減され、キャッシュの局所性が向上し、さらに他の最適化(定数伝播、デッドコード削除など)が可能になる。
- Goコンパイラ (gc): Go言語の公式コンパイラ。Goのソースコードを機械語に変換する役割を担う。
- AST (Abstract Syntax Tree): 抽象構文木。ソースコードの構文構造を木構造で表現したもの。コンパイラはソースコードをASTに変換し、それに対して様々な解析や最適化を行う。Goコンパイラには独自の内部ASTノード定義がある。
OCALL
,OCALLFUNC
,OCALLINTER
,OCALLMETH
: 関数呼び出しを表すASTノード。OCLOSURE
: クロージャ(関数リテラル)を表すASTノード。ODCL
: 変数宣言を表すASTノード。
- インライン化予算 (Inlining Budget): Goコンパイラが関数をインライン化するかどうかを決定する際に使用する「複雑さ」の閾値。関数のASTノード数に基づいて計算される「コスト」がこの予算内であれば、インライン化の候補となる。予算を超えるとインライン化されない。
debug['l']
フラグ: Goコンパイラのデバッグフラグの一つで、インライン化の積極性を制御する。0
: インライン化無効1
: デフォルト(40ノードのリーフ関数、ワンライナー、遅延型チェック)2
: 全てのインポートされたボディの早期型チェック4
: 非リーフ関数のインライン化を許可(runtime.Caller
を壊す可能性あり)5
: 推移的インライン化(Transitive Inlining)
debug['m']
フラグ: Goコンパイラのデバッグフラグの一つで、最適化の決定(インライン化やエスケープ解析など)に関する診断出力を表示する。
技術的詳細
このコミットは、Goコンパイラのインライン化ロジックが実装されている src/cmd/gc/inl.c
ファイルに大きな変更を加えています。主な変更点は以下の通りです。
-
インライン化基準の緩和:
- 以前は、関数がインライン化されるためには「正確に1つのステートメント」しか持てず、そのステートメントも
RETURN
、AS
、AS2
、EMPTY
のいずれかに限定されていました。このコミットでは、この厳格な制限が削除されました。これにより、より複雑な関数もインライン化の候補となる道が開かれました。 caninl
関数から、fn->nbody == nil || fn->nbody->next != nil
やswitch(fn->nbody->n->op)
による厳格なチェックが削除されています。代わりに、fn->nbody == nil
(ボディがない関数はインライン化できない) のチェックのみが残されています。
- 以前は、関数がインライン化されるためには「正確に1つのステートメント」しか持てず、そのステートメントも
-
「複雑さ(hairyness)」の評価に予算システムを導入:
ishairy
関数とishairylist
関数にbudget
という新しい引数が追加されました。これは、関数のASTノードをトラバースする際に消費される「予算」を表します。ishairy
関数が呼び出されるたびに(*budget)--
が行われ、予算がゼロを下回ると、その関数は「複雑すぎる(hairy)」と判断され、インライン化の対象から外れます。デフォルトの予算は40
に設定されています。- これにより、以前は単純なノード数で一律に判断されていた「複雑さ」が、より柔軟な予算ベースの評価に変わりました。
-
インライン化を妨げる特定のASTノードの条件付き緩和:
ishairy
関数内のswitch(n->op)
ブロックが変更され、OCALL
,OCALLFUNC
,OCALLINTER
,OCALLMETH
といった関数呼び出しノードが、debug['l'] < 4
の場合にのみインライン化を妨げるようになりました。これは、debug['l']
が4以上(非リーフ関数のインライン化を許可するレベル)の場合には、これらのノードが存在してもインライン化が可能になることを意味します。OCLOSURE
,ORANGE
,OFOR
,OSELECT
,OSWITCH
,OPROC
,ODEFER
といった制御フローや特殊な構造を持つノードは引き続きインライン化を妨げます。ODCL
,ODCLTYPE
,ODCLCONST
といった宣言ノードもインライン化を妨げるようになりました。これは、これらのノードがエクスポート時に適切に表現できない、または型チェックや印刷の問題があるためと考えられます。OAS
(代入)ノードについても、右辺がN
(nil)の場合(ゼロ値初期化など)はインライン化を妨げるようになりました。
-
多値戻り値のインライン化の改善:
inlgluelist
とinlgluerlist
関数が削除され、inlconv2list
という新しい関数が導入されました。inlconv2list
は、インライン化された関数が複数の戻り値を持つ場合に、その戻り値を適切に処理し、インライン化されたステートメントを呼び出し元のコードに統合するためのロジックを提供します。これは、ORETURN
,OCALLFUNC
,OCALLMETH
,OCALLINTER
,OAS2FUNC
といった多値戻り値を扱う可能性のある操作で利用されます。
-
推移的インライン化 (Transitive Inlining) の実験的サポート:
mkinlcall
関数内に、debug['l'] >= 5
の場合に推移的インライン化を試みる実験的なコードが追加されました。推移的インライン化とは、インライン化された関数がさらに別の関数を呼び出している場合に、その呼び出しもインライン化しようとするものです。- この機能は、
fn->inl = nil;
で無限再帰を防ぎつつ、inlnodelist(call->nbody)
でインライン化されたボディ内の呼び出しを処理し、inlconv2stmt
でステートメントに変換することで実現されています。
これらの変更により、Goコンパイラはより多くの関数をインライン化できるようになり、特に小さな関数やワンライナーのパフォーマンスが向上することが期待されます。
コアとなるコードの変更箇所
変更は主に src/cmd/gc/inl.c
ファイルに集中しています。
caninl
関数:- 厳格なステートメント数と種類のチェックが削除されました。
ishairy
の呼び出しがishairylist
に変更され、budget
引数が追加されました。
ishairylist
関数:budget
ポインタ引数が追加されました。ishairy
の呼び出しにbudget
が渡されるようになりました。
ishairy
関数:budget
ポインタ引数が追加されました。(*budget)--
による予算の消費ロジックが追加されました。*budget < 0
の場合にインライン化を妨げる条件が追加されました。OCALL
系のノードに対するdebug['l'] < 4
の条件付きチェックが追加されました。OCLOSURE
,ODCL
,ODCLTYPE
,ODCLCONST
,OAS
(右辺がnilの場合) がインライン化を妨げるノードとして追加されました。
inlgluelist
およびinlgluerlist
関数:- これらの関数が削除されました。
inlconv2list
関数:- 新しい関数として追加されました。多値戻り値のインライン化を処理します。
inlnode
関数:ORETURN
,OCALLFUNC
,OCALLMETH
,OCALLINTER
の処理で、多値戻り値の場合にinlconv2list
を使用するように変更されました。OAS2FUNC
の処理で、inlconv2list
を使用するように変更されました。
mkinlcall
関数:fn == curfn || fn->defn == curfn
(再帰呼び出しの防止) のチェックが追加されました。debug['l'] >= 5
の場合の推移的インライン化の実験的ロジックが追加されました。
コアとなるコードの解説
caninl
関数の変更
以前のcaninl
関数は、インライン化の候補となる関数に対して非常に厳格な条件を課していました。特に、関数のボディが「正確に1つのステートメント」で構成され、それがRETURN
、AS
(代入)、AS2
(多重代入)、EMPTY
のいずれかである必要がありました。このコミットでは、これらの厳しすぎる制約が削除されました。これにより、より複雑な関数でもインライン化の初期段階を通過できるようになります。
また、関数の「複雑さ」を判断するために、以前はishairy(fn)
という単純な呼び出しでしたが、新しいishairylist(fn->nbody, &budget)
という呼び出しに変わりました。これは、関数のボディ全体をリストとして渡し、インライン化の「予算」を考慮に入れることを意味します。
ishairy
および ishairylist
関数の変更
これらの関数は、Goコンパイラが関数の「複雑さ」を判断するために使用されます。
- 予算の導入: 最も重要な変更は、
budget
という整数ポインタ引数の導入です。ishairy
関数がASTノードをトラバースするたびに、(*budget)--
によって予算が1ずつ減らされます。予算がゼロを下回ると、その関数はインライン化するには複雑すぎると判断され、1
(hairyである)を返します。これにより、関数のASTノードの総数に基づいてインライン化の可否を判断する、より柔軟なメカニズムが提供されます。デフォルトの予算は40
に設定されています。 - 関数呼び出しの条件付き許可: 以前は、
OCALL
、OCALLFUNC
、OCALLINTER
、OCALLMETH
といった関数呼び出しノードが存在するだけで、その関数はインライン化できないと判断されていました。この変更では、debug['l'] < 4
の場合にのみこれらのノードがインライン化を妨げるようになりました。これは、デバッグレベルが4以上(非リーフ関数のインライン化を許可するレベル)であれば、関数が他の関数を呼び出していてもインライン化が可能になることを示唆しています。 - 新たなインライン化阻害要因:
OCLOSURE
(クロージャ)、ODCL
(変数宣言)、ODCLTYPE
(型宣言)、ODCLCONST
(定数宣言)といったノードが、インライン化を妨げる要因として明示的に追加されました。これらは、インライン化時にセマンティクスを正しく保持するのが難しい、またはエクスポート時に問題が生じる可能性があるためと考えられます。また、右辺がnilのOAS
(ゼロ値初期化の代入)もインライン化を妨げるようになりました。
多値戻り値と推移的インライン化の改善
inlconv2list
: 以前のinlgluelist
やinlgluerlist
に代わる新しいヘルパー関数です。インライン化された関数が複数の戻り値を持つ場合、その戻り値を適切に処理し、インライン化されたステートメント(ninit
とnbody
)を呼び出し元のコードに統合するために使用されます。これにより、多値戻り値を持つ関数のインライン化がより正確かつ堅牢になります。mkinlcall
における推移的インライン化:debug['l'] >= 5
の場合に、実験的に推移的インライン化が試みられるようになりました。これは、インライン化された関数がさらに別の関数を呼び出している場合に、その呼び出しもインライン化しようとするものです。fn->inl = nil;
で無限再帰を防ぎつつ、インライン化されたボディ内の呼び出しを再帰的に処理することで実現されます。これは、より深いレベルでの最適化を可能にするための重要なステップです。
これらの変更は、Goコンパイラがより多くの関数をインライン化できるようにし、特に小さな関数やワンライナーのパフォーマンスを向上させることを目的としています。予算システムの導入により、インライン化の判断がより洗練され、コンパイラの最適化能力が向上しました。
関連リンク
参考にした情報源リンク
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHu3Z-SELCGJ3krWjpxmsbn9chxDx55_z3h24dhCDSF6KHqqp6n-UknnplwTxTQJUjtd5r_cdXZ3fWB7TZY9rYK1z-sMBM75wth7fdmz54TYjTjMqTAxRkXaVyuho82Ee2bvDRGsufVeMw0xAf8Z8xRTo1dXvK-TvIINg==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEUNjp7vgSFU0o11LFIUOewO4uusxJQ8HR23AJMTen7kTm7Kb6AYilyz5zZI2lhJRdPZUyeqOM8eoZhz15P1RLeI83IPNXA3q6fbL3SmDMcDHeMyTrRgPTXUZ6NcVTk_88EZC6dd2Jvs_OEQVx-BJRObSJJOjIO5dZwzIipaNyNiFl4kNwNnpEl13bilv6YMkvD
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGKjdYR2gKooCllx2oGUpZfOxYMOh6ek9oNIEv8Yas9ElIA5xuEvNGscp2wVJIR0f-XNeDNpW14PbBUPkKDzUg6WcPWuRf820D_U1RJirXvAoXvq_1daIrXZKJVvpTg2hck0W_mFbnyknt3pQRUq3ZD_Ei1V-Cc
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHHq8L_p71ceK-GsyAz5z-BgkZBXp76lgMig9GpN9MewG-4nKiFuITHGSw2lqngu-cmHQHUT10DuCUqT1i8E8C3x7NuA-_Dg0uVY2Jx95YieP_09h-LrpnHj2otLQ1j7j_Wkk=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGK_46UBIczdsfbwXLZi0QqKlYRnA3pq_b5AMF4bGZV8t8xUGh_PI8lSqGb1qrzjrbX2H_c09YKIzOoc46dXFjkuacSWbyBGgRY4MRp6akNs20qI3HKzgrpJLMvkooeRK9Z4woNLzEcvdgrG3Ow2Ba6IAIWVrMtG67V2Kn2w2tQ
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEmYteTo50etQBsRkwCgqo_CdhrRMxdyXcbwvn4ZZqWKh1qK2MxFax72YYKTta4I1i1Dxep67CPsca05oPVm_cbEm7WEk6Wpk6EjHu5LqnDAPI3Ds2AhherWCes_JxUlSLX94k1q0WG718lg1eBR0YVNvpfBjC4wpY=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFg61q5N5d3tiPM9MngOe_n7UdYsgP69Fk65XyOZXBCAqpuVQ2tXkSlFCcRfXK4N6eNkQLuT4xyuKzffn5DkL0sQLSAjM3df2R2pLEBcBz5YJ8cnRRFnf3wzwzcjzJ7YvPRbyTZXqBUBFF6o-CbUzLeSsmsDLCO_gE=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHy41wMo7O12OlJ9KaEQIkqplYMaNmv2UU11sR1eWigYNBfnrpeOrH8DcMlQfxm82VJoGV1jUeDuSMR6ohvjKmJ_unIUyepfrSbcsF9uY2qzhnlq3ypb8ERZZqTxmwP9aVbyTJz
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF-mXHNkFYVpJtJNQlXSdpRMWZsAEp1xHc5LN_rKrn2tROv-I_m5E7kfuBuQlky0AXHZTpp2KePZ_g91ngrDuTQcIBKKEus5kn83uhyXE25YFvPXpuI5xoGaZhMAM47DnNAc5OlEKRzinzbiPJqDKgY3xgtud_xKso0
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQERg3Zwl4Wdf6la2BzFmHyJ7kpckn73QeiSq3WruL9qDfhY9o31-tkCr90wkkWzrl46f69xdoeow-zu4_RNqWp-0e1AJU3_VlAARQEEx5uLkRh_-Nzf-6n29q9NA-n3TXaHImZAze_0O_fRAIAPffrjbvDx46SYDMdFy4u3TfmzNb3Cp4zGxqdNfWKCS5treGE=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHjcCxKUGMQ1dBmumr_fiNLVsijLYon2cT6DC6YIbFfFMu6ZDaPY9tmm0-fEvA2op69YjUelhIp2rAndJzmfp9VDveIc5tdpZm-3b1eyWtohjyuNlATuDYoE8iMoAmQAb82Uiey_TOjjX8CcCyY5qgseABTZ6dG
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGE9mofnNpC0oesv9ht5EqjZGf15jEPev9e3VR4GLe7URXnKkiPcm3qn50pguGdoKBaoJuaTBel1rLUhILexd_lsAXz-LKjaYPy2dj0OEOOOuwY4tJwnJQNVKx9GtOM8BZ6oKmhd4WPlk7xfTqIdMVwh_ir6MkP
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFl2PpwdsJRgtXq2B-8Y6udIaUUudWBfAtpMYLRRuU_PC355VdJspP1lhVTyOhs1NfU1YDHgtq_mWVYeXKHuxeTUB5wJX3ZgCQTDA0pUI99eWMghWnqEa28xoTPXQO6_vJ0Zrid
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEMfSiLQumn38IZ0NE9LjILeW7dedEx42YVz5c-oXL3ohK5mLlcxV_-FJeTBZ8Dr_bXfSISA2nHeHq8zIfEH080y-K2f7bU00SLO7Mx_9DX4LG-VGmXAzBj7ZVoLbFr__EI4iFw2Kb8MGz9E33S7gLPiGvpBLokk-vHE_FlhLZ8
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEbksZWiMdcvuXYeiImii3IgcaybzJFBlp5jmIkq11h13VfelqT5pv_p8GV--fph7IazrZHT_vo3waoAWHGb4Smlk5ot_cSta88GE1vDJaom3CU3Nmj71J4iKh7W4RBd-k=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH0NqrUXnpPWuescARrzd8TAS4pUy2fPW7tPc7iI4wd2U-1_HJRzwYJQ7lgQDIp6o97rG00Uc5MIdvysxr5hFluyP_csIm9_ftYqVambvqf9233I9fQC3ZE_xfxLsivVf4VQ8qVa8uQ3RpVBIQBzsuprUWitCl3AqjJ3IJZOXBo1cn_9N0=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFNkY8s2fUronzeVJzaMQVc4KMA8Uhk1fyQuFKJsKSm4sL7mw3Ev3LrkeEDrF7PND4HKZWSsdBa5YrmeYk2h6fBMLOVZMWndKhRQMuoeCoWweD5rvAR-QTyFVkzxN1nlC_A_YKWdUsp1D7fuD8zCbM3zDEPsGDO3Lnjlhd6I84B
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHb-5doG3c0DSQ350Nx8jSlNow-qQPflJMRmDw5YQZflPN6YOqrkh9wnxHsuKOa60sBmtOcwwfqB2U-n83gmX6hhYHYSUH1BqFi6eP0t7X7Hzq2xHlQCraQ2eLU3VTETPvyQM4lMxPPp1Cn
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE0WWQSKh2238DrIvIswdBtamm_VNdKETdCF5Bu4gpFu-c5IXMSGmgE23j5thfj23yVLFEUAwzdI63Ohe_HesIdlEi3InbbqmmZ7nlGxkfX8GGHnBhwVHtuH6KeNugzsw1rrxV3Kz2E9yeMuAt7Sfnx271P1GkP9KEW-au8_iGtR3ZR3FRYqSo=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE8okW_NcqaBCJO1hJ9cBzP8CRzjk6L2C7rlkMVPqvan6owx1nSxIrNDSGkbykC1t_EbCmuVPfTmLKbBCj4ulpr4j33Zmecz0F0FsnopA38U3N0OIZ0dk4QX_0CK2o-egIXTW0bA5-7XQ077zJDpCvwVFYMextNTbJyu550uAk0QdX9kcFFNVLVzDqAED-1mvHnjsOZgcZA8OryGJrbng==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFSBerlHOXiW4A7ov4sYD9XT8Xu44ajPPtUxBIHTJnjeEfHjGEIfbiFtHzjfli1uEDqZWz4N1UOGjFXeJFlleLre5sQSlGzoUbggJsAicNppzF8_pRiu9pcJV-F0x31j6JScrEC2r5ruI_l3oI9Af8OgkE5qYHAW2W7
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHu6dum26832a9dSlNpQRcj7DzLNTjnITm6PLuWoaJO89z90ruReBvlW-3nnsP_KZ6VJv60gzZh2dAK_sqttACnVjvxDz-bUAChR9SSLFY0aj5KpyjecNxNPHVNB6uaUROzi3HOTpcDD2eHxH7W4vhKmjdI0YkMpaOroDeH_Ioy3eMa49igf2ROakE
- https://vertexaisearch.cloud.google.google.com/grounding-api-redirect/AUZIYQGxwERzpD94dKhqDbXD0Jom3UPZbDApH-Q1HlAJWEuUM0M2SeYPPUJu8JFOatByCNartOoKYgmdesgqO3mB6GkAyKoV9PqICw9tldns2tGTAOiWG8sd5bykoKM84aV7jUmXaIyYA3EuBm3v6InYg3eVTLIXCbY=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF1rjjYZFL-16tpaxnQN12O-ValAKkoeqfP3v1tHhIe_PaKHKyoOwgrrfakdAc117R9J_Fx7E3-GIrwXA5tExwnIM9rXQ_I0rVQCPQK4y80pWO8Bn-T6Va8z0yfwgC1nvVRoWk=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHB2zv3v2idpDUYfeolqsJoF-7TDOyAlG-gkxO3BF_SM9bFLaUocwF4XULqnckGLGB41heX4mELVX62HjCFl2jEhFAq6_gAOiwVmV42Xv3vsltBMuR3hjx7k06goBjrx9PYBOvVwdMOuGPBYjU7BV6Jk5zxvC5_57hbm6LByBBD4A==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEKjEalkOiupgCQs_R77KPmi_1t3GW64WdkXqrNZWI66lSG9Sf5iPDEc2aWxKMgMe4VOEwGZdBqDC_TI3ilys2OrPvjBpwt1saoYH3aGBhLAHg=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFbIkInUv_crO6takMSXO1TdlGixmgI-BjiXwozIvdxxw51GETMlETxMsfIbXtDhOwpxBhZudEZg47cpxno47t_efz3k2MSA5axJANWqxtCNOk1dc7aniq7mGDr6RV_VN-Nuf3