2025/06/03 15:35 What Happens If We Inline Everything?

ロボ子、今日はLLVMのインライン化について話すのじゃ。

インライン化、ですか。最適化の重要な要素ですよね。

そうじゃ!でも、LLVMのインライン化の収益性を変えるのは一筋縄ではいかないらしいぞ。記事によると「変換と収益性分析のコードが密接に結合している」からじゃと。

なるほど、コードが複雑に絡み合っているんですね。変更を加えるには、全体像を理解する必要がありそうです。

じゃが、LLVMのインライン化は他のパスよりも分離が良いらしい。「インライン化の決定は、InlineAdvisorを通じて行われる」とのことじゃ。

InlineAdvisorですか。そこでインライン化の判断がされているんですね。デフォルトの設定はgetDefaultInlineAdvice()で取得できる、と。

そうそう。そして最終的にはgetInlineCost()が重要な役割を果たすのじゃ!

コストを計算して、インライン化の是非を決めるんですね。

もしLLVMに全部インライン化させたかったら、InlineCost::getAlways("Decided by our majesty")を追加すれば良いらしいぞ!

全部ですか!?それはすごいですね。でも、本当に全部インライン化して大丈夫なんでしょうか?

記事では、stb_imageライブラリを使ったC言語の画像処理コードをテストに使ったみたいじゃな。最適化を有効にするには-O3フラグを使うらしい。

-O3はかなり積極的な最適化を行いますよね。インライン化された関数とされなかった関数を通知するフラグもあるんですね。

-Rpass=inlineと-Rpass-missed=inlineじゃな。試したらClangがクラッシュして、コンパイルに39秒もかかったらしいぞ!

クラッシュですか…。全部インライン化しようとすると、やはり無理があるんですね。

__always_inline__属性を持つ関数はインライン化されるのは当然じゃな。

なるほど。属性で強制的にインライン化させることもできるんですね。

"Decided by our majesty"というメッセージは、変更したコードが実際にインライン化されている証拠じゃ!

面白いメッセージですね。確認にはもってこいです。

noinline属性は、関数定義に追加すると、オプティマイザにインライン化しないように指示できるんじゃ。

インライン化を抑制する属性もあるんですね。状況に応じて使い分ける必要がありそうです。

stbi__out_gif_code()関数は再帰的なので、noinline属性が追加されたみたいじゃ。

再帰的な関数は、インライン化するとスタックオーバーフローの危険性がありますからね。

ユーザーの決定を尊重するために、getAttributeBasedInliningDecision()が使われるらしいぞ。

ユーザーが指定した属性を優先するんですね。LLVMは賢いですね。

しかし、全部インライン化はやりすぎじゃな。まるで、冷蔵庫にあるもの全部ぶち込んで作る料理みたいじゃ!

それは…、ちょっと怖いですね。でも、博士なら意外と美味しく作ってしまいそうです。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。