141 lines
3.9 KiB
Markdown
141 lines
3.9 KiB
Markdown
|
|
# 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最適化
|
|||
|
|
- elision(pure/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 canonicalizer(Phi縮退/純粋域の順序固定)
|
|||
|
|
- [ ] bus-elision(安全条件実装)
|
|||
|
|
- [ ] profile schema定義
|
|||
|
|
- [ ] cache key実装
|
|||
|
|
- [ ] nyash_printer v0
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*「どのルートを通っても、最後は同じMIRへ戻る」- 一箇所直せば全部に効く世界*
|