LLVM: 悪い部分
概要
- LLVM IRの設計課題とその進捗状況のまとめ
- 高レベルな開発課題とコミュニティ運営の問題点
- ビルド時間やCIの安定性、エンドツーエンドテストの不足
- バックエンドの分断やパフォーマンス計測基盤の未整備
- IR設計に関する根本的な問題点の指摘
LLVM IR設計課題と開発運営上の問題点
- LLVM IRの設計上の課題は、継続的に改善が進められており、過去に指摘した問題のいくつかは既に解決または進行中
- opaque pointers移行は完全に解決、constant expressionの削除はほぼ完了、ptradd移行も進行中
- 本稿は、LLVMのリードメンテナー視点での改善機会のリストであり、LLVMを否定するものではなく、今後の発展のための指摘
レビュー体制の課題
- 貢献者数は多いが、レビュー担当者が不足している現状
- コードレビューは専門知識が必要で、即時的な価値を感じにくい
- PR作成者がレビュワーを指定する方式は、新規参加者にとって障壁
- RustのようなPR自動割当システム導入の検討余地
APIとIRの頻繁な変更(Churn)
- LLVM C++ APIとLLVM IRは非安定で頻繁に変更
- 柔軟性と進化の速さが強みだが、ユーザー側には追従コストが発生
- C APIは比較的安定だが、すべてをカバーできない
- LLVMの開発哲学「upstream or GTFO」による、外部コードの取り込み難しさ
ビルド時間の問題
- LLVM本体は250万行超、モノレポ全体で約900万行
- C++のビルド時間が長く、特に低スペック環境では厳しい
- デバッグビルド時のリンク・メモリ・ディスク消費の増大
- プリコンパイルヘッダーやdylibビルドの導入、デーモン化によるテスト高速化などの改善策
CIの安定性
- 200台以上のビルドボットによる多様な構成でのCI
- 常に完全なグリーン状態にはならず、flakyなテストやビルドボット固有の問題が混在
- pre-mergeテスト導入で状況は改善したが、ビルドボット問題は依然残る
- コミット数・ビルド時間のスケール問題で、bors/merge queueのような手法の適用が困難
エンドツーエンドテストの不足
- LLVMのテストは最適化パス単位のユニットテストが中心
- パイプライン全体やミドルエンドとバックエンドの組み合わせのテストはほぼ未整備
- 実行可能ファイルレベルのテストはllvm-test-suiteに分離されており、開発時には使われにくい
- 基本操作の網羅的テストが不足しており、型サポートの制約も課題
バックエンドの分断
- ミドルエンドは統一的だが、バックエンドは実装が分断・重複
- ターゲット固有最適化やフックの乱用による分岐・重複の増加
- 他ターゲットへの影響評価の難しさから、対応が限定的になりがち
- エンドツーエンドテストの不足が問題を助長
コンパイル時間
- LLVMのコンパイルは遅い。JITやRust/C++の大規模IR生成で特に顕著
- 近年は改善傾向だが、依然として最適化なし(-O0)時もコストが高い
- TPDE代替バックエンドは一桁速い実装例を示している
パフォーマンス計測基盤の未整備
- ランタイム性能追跡の公式インフラが存在しない
- 各組織が独自に追跡する状況で、貢献者が変更の影響を評価しにくい
- LNTは存在するが、使い勝手やデータ量、PR単位のテスト依頼不可など多くの課題
IR設計上の根本的課題
- undef値は未初期化値のモデル化に使われるが、複数回利用時の値の一貫性や最適化困難を招く
- poison値への移行が進むが、メモリ内poisonの正しい扱いにはIRの追加機能(byte型など)が必要
- 仕様の不完全性や健全性問題が一部未解決のまま残存
以上がLLVM IR設計および開発運営上の主要な課題と、その現状・背景のまとめ。今後の改善に向けた指針や議論の出発点となる内容。