Cm v0.14.2 リリースノート

リリース日: 2026-03-07 前バージョン: v0.14.1

✨ ハイライト

v0.14.2はTagged Union(Result/Option/enum)のペイロード抽出に関する重大バグ2件の修正ASM過剰volatile生成の修正Dead Function Elimination(DFE)の追加__asm__定数展開モノモーフィゼーション最適化を含むパッチリリースです。ベアメタル環境でのResult型エラーハンドリングを安全に使用可能にし、コンパイル・テスト性能を改善しました。


🐛 重大バグ修正: Tagged Union ペイロード

Bug#1: ペイロード型の64bitハードコード問題

mir_to_llvm.cppconvertPlaceToAddressでTagged Union(enum/Result/Option)のペイロード型がhir::make_int()(i32)にハードコードされ、64bit型のペイロードが切り詰められる問題。

項目 詳細
症状 Result::Ok(0)のペイロード抽出で188050848088064等の不正値
原因 ペイロード型がi32固定 → 64bit値の上位4バイトが未読
修正 type_argsから動的にペイロード型を推論、64bit型存在時はi64を使用
テスト JIT 365 PASS / LLVM 399 PASS、回帰なし

Bug#2: ペイロード部分書き込みによるundef bytes

Result::Ok(0)等のenum construct時、ペイロード値(i32)がi8[N]に部分書き込みされ、LLVM最適化がmemset+storeconstant phiに畳み込む際にundef bytesが生成される問題。

項目 詳細
症状 ベアメタル環境でResult<ulong, long>::Ok(0)の値にゴミデータ混入
原因 ペイロードストアが32bitのみ→残りバイトがundefined
修正1 payload storeにZExt(Zero-Extension)を追加し正確なビット幅に拡張
修正2 retval allocaにstruct型ゼロ初期化を追加
修正3 resolve_typedefにモノモーフ化enum名フォールバック追加

影響: この修正によりResult<T, E>でT==E(例: Result<long, long>)が正しく動作。ベアメタル環境を含む全レイヤーでResult型エラーハンドリングが使用可能に。


🐛 その他のバグ修正

ASM含有関数の過剰volatile生成

__asm__を含む関数で全ローカル変数にvolatile属性が付与され、不要なalloca volatile store volatile loadチェーンが生成される問題を修正。

修正前: outb(ushort, utiny)  13回のメモリ操作、0x43バイト
修正後: outb(ushort, utiny)  0回のメモリ操作、0x4バイト

型キーワードのnamespace名衝突

import ../lib/string;で展開されるnamespace string { ... }がCm組み込み型stringと衝突する問題を修正。

その他

問題 修正内容
varargs関数のパラメータ数検証 最小引数数でのガードに修正
callee関数のシンボル検索失敗 impl内関数のルックアップロジック修正
文字列スライスの範囲外アクセス スライス境界チェック追加
プリプロセッサのデバッグログ debug_modeガードで保護
パーサ無限再帰 安全ガード追加
DFEラムダ関数誤削除 ラムダ関数をDFEスキップ対象に追加
interface impl関数のDCE除去 未使用誤判定の修正
フォーマッター バッククォートインデント崩壊修正、括弧内継続行修正

✨ 新機能

Dead Function Elimination (DFE)

MIR→LLVM変換時に未使用関数を除去する最適化パスを追加。ベアメタル環境でのバイナリサイズ削減に有効。

enum値の文字リテラルサポート

parse_enum_declCharLiteralを受け付けるよう拡張。

export enum Ascii {
    LowerA = 'a',
    LowerB,        // 98 (オートインクリメント)
    UpperA = 'A',
    Digit0 = '0',
}

__asm__内の${CONST_NAME}定数展開

lower_asmでasm文字列中の${CONST_NAME}パターンを検出し、global_const_valuesテーブルから定数値を取得して16進数リテラルに直接置換。colonを含む${+r:var}等のオペランド記法はスキップ。

x86_64 Dockerクロスビルド対応

x86_64ターゲット向けDockerビルド環境を追加。LLVM共有ライブラリ + C++静的リンクの最適構成。


⚡ パフォーマンス改善

モノモーフィゼーション反復ループ最適化

項目
最大反復数 10パス (全関数フルスキャン) 2パス (2パス目は新規関数のみ)
monomorphize_structs() 2回実行 1回に統合

ネストジェネリクス(Queue等)にも対応。

テストランナー並列化改善(FIFOセマフォ方式)

項目
同期方式 PIDポーリング (kill -0 + sleep 0.05) FIFOセマフォ (mkfifo + fd)
max_jobs CPU数 CPU数×4 (I/Oバウンド考慮)
実行時間 1:57 51.5s (55%短縮)
CPU使用率 100% 232%

📁 主要な変更ファイル

ファイル 変更内容
src/codegen/llvm/core/mir_to_llvm.cpp ASM volatile修正、DFE連携、64bit payload型推論、ZExtストア、retvalゼロ初期化
src/mir/lowering/base.cpp resolve_typedefモノモーフ化enum名フォールバック
src/mir/lowering/context.cpp resolve_typedef enum_defs検索フォールバック
src/mir/lowering/stmt.cpp __asm__${CONST_NAME}定数展開
src/mir/passes/cleanup/program_dce.cpp Dead Function Elimination実装
src/mir/passes/monomorphization_impl.cpp モノモーフ反復ループ2パス最適化
src/frontend/parser/parser_expr.cpp 型キーワード名前空間修飾子対応
src/frontend/parser/parser_module.cpp enum値CharLiteralサポート、無限再帰ガード
src/frontend/types/checking/stmt.cpp Tagged Union 64bitペイロード型チェック
src/fmt/formatter.cpp バッククォート+括弧継続行修正
tests/unified_test_runner.sh FIFOセマフォ並列化 (55%短縮)
Dockerfile x86_64クロスビルド環境 (新規)

📊 テスト結果

バックエンド 通過 失敗
JIT (O0) 365 0
LLVM Native 399 0
Baremetal 全通過 0

🔮 今後の予定