Files
hakorune/docs/private/papers/paper-d-ssa-construction/current-struggles.md

137 lines
3.5 KiB
Markdown
Raw Normal View History

# 現在のSSA構築における苦闘記録
*2025-09-12時点の生々しい記録*
## 🔥 現在直面している問題
### 1. PHI配線の複雑さ
```llvm
; エラー例
PHINode should have one entry for each predecessor!
%phi_30 = phi i64 [ %74, %Main_esc_json_1_bb27 ]
```
**原因**:
- MIRのPHI入力と実際の前任ブロックの不一致
- 動的な制御フロー変更によるpred/succ関係のずれ
- sealed/unsealed両モードでの配線タイミングの混乱
### 2. 型の不整合
```llvm
; よくある問題
%str = phi i8* [ %handle_as_i64, %bb1 ], [ %ptr, %bb2 ]
; → i64 handleとi8* ptrの混在でverifyエラー
```
**Nyash特有の問題**:
- Everything is Box → すべてi64 handle
- でもLLVMは型付き → ptr型が必要な場面
- 動的な型変換の必要性
### 3. Dominance違反
```llvm
Instruction does not dominate all uses!
%val = ...
%use = ... %val ... ; valの定義より前に使用
```
**複雑な要因**:
- 文字列定数のhoistingentry blockへ移動
- ループ内での値の循環参照
- BuilderCursorの位置管理ミス
## 💡 試行錯誤の記録
### Phase 1: 素朴なアプローチ(失敗)
```rust
// 最初の試み単純にPHIを作って配線
let phi = builder.build_phi(ty, "phi");
phi.add_incoming(&[(&val, pred_bb)]); // → 爆発
```
### Phase 2: Sealed SSA導入部分的成功
```rust
// block終了時点でのスナップショット
let block_end_values: HashMap<BlockId, HashMap<ValueId, Value>> = ...;
// seal時にスナップショットから配線
```
**改善点**:
- pred終了時点の値を確実に取得
- でも完全ではない(未定義値の扱い)
### Phase 3: BuilderCursor現在
```rust
// 位置管理を構造化
cursor.with_block(bid, bb, |c| {
// この中でのみ命令挿入可能
c.emit_term(bid, |b| { /* terminator */ });
});
```
**狙い**:
- 終端後の命令挿入を構造的に防止
- でもまだPHI問題は解決せず...
## 📊 デバッグから得た洞察
### 1. PHIトレースログの分析
```
[PHI:new] fn=Main_esc_json_1 bb=30 dst=30 ty=i64 inputs=(23->7),(27->30)
[PHI] incoming add pred_bb=27 val=30 ty=i64
; → bb=23からの配線が欠落
```
### 2. ゼロ合成の功罪
```rust
// 未定義値への対処として0を合成
match phi_ty {
IntType => int_ty.const_zero(),
PtrType => ptr_ty.const_null(),
// ...
}
```
**利点**: verifyエラーを回避して前進
**欠点**: 意味的に正しくない可能性
### 3. LoopFormへの期待
```
現在: 複雑なCFG → 複雑なPHI配置
LoopForm: 定型dispatch → PHI配置が自明に
```
## 🚀 次の一手
### 短期(今すぐ)
1. preds_by_blockの完全な正規化
2. PHI配線の網羅的チェック
3. 型変換の統一ポリシー
### 中期LoopForm
1. whileループのみLoopForm化
2. dispatch blockでのPHI集約
3. 段階的な適用拡大
### 長期(論文化)
1. この苦闘を体系化
2. アルゴリズムとして定式化
3. 他言語への適用可能性
## 🎓 学術的価値
**なぜこの苦闘が論文になるか**:
1. **実践的課題**: 理論と実装のギャップ
2. **Box言語特有**: 動的型付けとSSAの相性
3. **解決手法**: BuilderCursor、sealed SSA、LoopForm
4. **再現可能性**: 具体的なプログラムとログ
**想定読者**:
- 言語実装者
- コンパイラ研究者
- LLVM利用者
---
*この記録は、生々しい実装の苦闘を論文の素材として残すものである。*