English

MIR最適化パス

学習目標: Cmコンパイラに実装されている最適化パスを理解し、効率的なコードを生成する方法を学びます。
所要時間: 20分
難易度: 🟡 中級〜🔴 上級


概要

Cmコンパイラは中間表現(MIR)レベルで複数の最適化パスを実行し、効率的なコードを生成します。


最適化レベル

レベル オプション 説明
O0 -O0 最適化なし(デバッグ向け)
O1 -O1 基本最適化
O2 -O2 標準最適化(推奨)
O3 -O3 積極的最適化
# 最適化レベル2でコンパイル
cm build -O2 main.cm

実装済み最適化パス

スカラー最適化

Constant Folding(定数畳み込み)

コンパイル時に定数式を評価します。

// 最適化前

// 最適化後(コンパイル時に計算済み)

アルゴリズム: 定数オペランドの演算を即座に評価


SCCP(Sparse Conditional Constant Propagation)

条件分岐を考慮した高度な定数伝播。

// 最適化前
    x = 20;
}

// 最適化後

アルゴリズム: Dataflow解析 + Work-listアルゴリズム


冗長性除去

DCE(Dead Code Elimination)

使用されないコードを除去します。

// 最適化前
return x;

アルゴリズム: 使用-定義チェーンの逆追跡


DSE(Dead Store Elimination)

上書きされる代入を除去します。

// 最適化前
x = 20;
return x;

GVN(Global Value Numbering)

共通部分式を検出して再利用します。

// 最適化前

// 最適化後

アルゴリズム: 式ハッシュによる等価性検出


ループ最適化

LICM(Loop Invariant Code Motion)

ループ内で変化しない計算をループ外に移動します。

// 最適化前
for (int i = 0; i < n; i++) {
    arr[i] = constant + i;
}

// 最適化後
for (int i = 0; i < n; i++) {
    arr[i] = constant + i;
}

アルゴリズム: ループ検出 + 支配木解析


制御フロー最適化

CFG Simplify(制御フロー簡約化)


関数間最適化

Inlining(インライン展開)

小規模な関数を呼び出し元に埋め込みます。

// 元の関数

// 呼び出し側

// インライン化後

制限:


Program DCE(プログラムレベルDCE)

未使用の関数やグローバル変数を削除します。


無限ループ防止機構

最適化パスが収束しない場合の安全機構:

機構 設定
最大反復回数 10回
最大パス実行数 200回
タイムアウト 30秒(パスあたり5秒)
循環検出 ハッシュベース(履歴8個)

使用アルゴリズム

アルゴリズム パス 説明
Work-list SCCP, DCE 収束計算
Dominator Tree LICM ループ検出
SSA Form 全般 静的単一代入形式
Expression Hashing GVN 式の等価性検出
Use-Def Chain DCE, DSE 使用-定義解析

デバッグ

最適化の動作を確認:

# 最適化デバッグ出力
cm build --debug-opt main.cm

# MIRダンプ
cm build --dump-mir main.cm

次のステップ

最終更新: 2026-02-08