Files
hakorune/docs/ideas/other/2025-08-27-mir-roundtrip-optimization.md

141 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MIRラウンドトリップ最適化 - 永続チューニング装置
作成日: 2025-08-27
Status: 構想段階
Priority: High
Related: ChatGPT5との共同構想
## 🎯 核心コンセプト
**nyash → MIR → VM → Cranelift → nyash再出力**
このループを回すことで、最適化の恩恵を全ルートに一括で波及させる「永続チューニング装置」を実現。
## 🏗️ ラウンドトリップの芯揺るがない3点
### 1. 唯一の真実MIR
- すべての最適化はMIR上に集約
- VM/Cranelift/WASM/LLVMはMIRの投影でしかない
- ルート固有の最適化は「MIRヒント属性」として逆流
### 2. MIRは常に正規形canonical
```
MIR → Canonicalizer → MIR*
```
- 順序・冗長・等価命令を正規化
- どのルートを通っても再度正規形に戻す
- 振動(最適化の行ったり来たり)を防ぐ
### 3. 再出力nyashは「意味等価の整形」
- MIR → nyash_printerで人が読めるnyashに戻す
- 目的は可読な再配布・差分レビューと最適化の可視化
- コメント/マクロは期待しない
## 💎 必須コンポーネント(超ミニマム)
### MIR Canonicalizer
- SSA再構築
- 冗長Phi削除
- `pure`のCSE
- `mut`の順序制約保持
- `io`は並べ替え禁止
### MIR Verifier
- 強1本・強循環禁止
- `weak`失効チェック
- `@gcable``fini`禁止
- 効果整合性
### nyash_printer
- public/privateフィールド再構成
- 関数、with/readガード、Sync<T>復元
- ソースマップMIR↔nyash保存
## 🚀 最適化の入口MIR上だけ
### ローカル最適化
- peephole, const-fold, copy-prop
- dead-branch, LICM(pure)
### 所有/弱参照最適化
- adopt/release短絡
- weak_loadのnull先行分岐
### Bus最適化
- elisionpure/read & 単一受信なら直呼び)
### 同期最適化
- `read`→共有ロック
- `write/io`→排他ロック
### プロファイル誘導
```
VM収集データ → MIR属性に反映
- op_count
- hot_bb
- bytes_copied
- send_count
```
## 🛡️ 無限最適化にしない「固定点」の作法
### 三段階で必ず終了
```
正規化 → 最適化 → 正規化
```
### 単調コスト
以下を悪化させたら採用しない/ロールバック:
- `instr_count(pure域)↓`
- `bytes_copied↓`
- `send_count↓`
- `alloc_freeバランス≥0`
### 等価性ガード
- I/Oログ完全一致
- fini順序一致@must_drop対象
### ハッシュ鍵
- MIR*の構造ハッシュを成果物キャッシュキーに
- 同形なら二度目以降はスキップ
## 📊 実行フロー(今日から回せる)
```bash
nyash --emit-mir src.ny > a.mir
mir --canonicalize a.mir > a*.mir
mir --optimize a*.mir > b.mir
vm --bc b.mir > b.bc
vm --run b.bc # 基準実行+プロファイル採取
jit --cranelift b.mir > code # JIT or AOT
mir --pretty b.mir > b.ny # 最適化後nyash出力
```
## ✅ CIに入れる「黄金テスト」
- **同値**: `interp == vm == cranelift`結果I/Oログ
- **GC等価**: `--gc=on/off`でログ差分0
- **資源確定**: `open==fini(@must_drop)`
- **ゼロコピー**: `dup()`以外で`bytes_copied == 0`
- **サイズ**: `send_count / alloc_count`が基準値以下
## 🎯 まず入れるべきパス(効果大きい順)
1. **Bus-elision**(安全条件つき)
2. **CSE/Copy-prop/Dead-branch**`pure`域)
3. **WeakLoad先読み**null fast-path
4. **Mutex/Rwロック折り畳み**(単一呼出シーケンス統合)
※これだけでVM/Cranelift/WASMの全部が速くなる
## 📝 直近ToDo
- [ ] mir canonicalizerPhi縮退/純粋域の順序固定)
- [ ] bus-elision安全条件実装
- [ ] profile schema定義
- [ ] cache key実装
- [ ] nyash_printer v0
---
*「どのルートを通っても、最後は同じMIRへ戻る」- 一箇所直せば全部に効く世界*