277 lines
7.4 KiB
Markdown
277 lines
7.4 KiB
Markdown
|
|
# Phase 276 P0 - Quick Win 改善完了
|
|||
|
|
|
|||
|
|
Status: ✅ Completed (2025-12-22)
|
|||
|
|
|
|||
|
|
Parent Phase: Phase 275 P0 完了後の堅牢性改善
|
|||
|
|
|
|||
|
|
## 🎯 実施内容
|
|||
|
|
|
|||
|
|
### Task 1: デバッグスタックトレース削除 ✅
|
|||
|
|
|
|||
|
|
**ファイル**: `src/llvm_py/phi_wiring/wiring.py`
|
|||
|
|
|
|||
|
|
**変更内容**:
|
|||
|
|
- Line 100-103: `traceback.format_stack()` 出力削除
|
|||
|
|
- デバッグ完了後の不要な診断コード削減
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- ログ出力がクリーンに
|
|||
|
|
- デバッグ時のノイズ削減
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 2: box_from_f64 使用確認 ✅
|
|||
|
|
|
|||
|
|
**調査結果**:
|
|||
|
|
|
|||
|
|
#### 定義箇所
|
|||
|
|
`crates/nyash_kernel/src/lib.rs`:
|
|||
|
|
- Line 246-252: `nyash.box.from_f64` (古い汎用版)
|
|||
|
|
- Line 974-982: `nyash.float.box_from_f64` (Phase 275 P0 追加版)
|
|||
|
|
|
|||
|
|
#### 使用状況
|
|||
|
|
- **Rust側**: 定義のみ、使用箇所なし
|
|||
|
|
- **Python LLVM側**: ExternCall 呼び出しなし
|
|||
|
|
- **MIR生成側**: 生成コードなし
|
|||
|
|
|
|||
|
|
#### 削除可否判断
|
|||
|
|
**✅ 削除可能**
|
|||
|
|
|
|||
|
|
**理由**:
|
|||
|
|
- Phase 275 P0 の Float 型 SSOT 方針により、Float は **unboxed double** として vmap に直接保存
|
|||
|
|
- Boxing helper 関数は不要(PHI で double 型を直接使用)
|
|||
|
|
- 両関数ともに使用箇所なし
|
|||
|
|
|
|||
|
|
**削除推奨箇所**:
|
|||
|
|
```rust
|
|||
|
|
// crates/nyash_kernel/src/lib.rs
|
|||
|
|
// Line 244-252: nyash.box.from_f64 削除
|
|||
|
|
// Line 971-982: nyash.float.box_from_f64 削除
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**注意**: 削除前に最終テスト実行を推奨
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 3: 型取得ロジック統一 (SSOT化) ✅
|
|||
|
|
|
|||
|
|
**問題**: 型取得ロジックが3箇所で重複
|
|||
|
|
|
|||
|
|
**解決**: 新規ファイル `src/llvm_py/phi_wiring/type_helper.py` 作成
|
|||
|
|
|
|||
|
|
#### 新規ファイル構成
|
|||
|
|
|
|||
|
|
**ファイル**: `src/llvm_py/phi_wiring/type_helper.py` (72行)
|
|||
|
|
|
|||
|
|
**提供関数**:
|
|||
|
|
1. `get_phi_dst_type(builder, dst_vid, inst=None)`
|
|||
|
|
- PHI destination type 取得
|
|||
|
|
- 優先度1: MIR JSON instruction の dst_type
|
|||
|
|
- 優先度2: resolver.value_types (型推論後)
|
|||
|
|
- 返り値: 'f64', 'i64', 'void', 'handle', None
|
|||
|
|
|
|||
|
|
2. `dst_type_to_llvm_type(dst_type, builder)`
|
|||
|
|
- MIR dst_type → LLVM IR type 変換
|
|||
|
|
- 'f64' → ir.DoubleType()
|
|||
|
|
- その他 → builder.i64
|
|||
|
|
|
|||
|
|
#### 統一化箇所
|
|||
|
|
|
|||
|
|
**3-1. tagging.py** (Line 79-82)
|
|||
|
|
```python
|
|||
|
|
# Before: inst.get("dst_type") 直接取得
|
|||
|
|
# After: type_helper.get_phi_dst_type(builder, dst0, inst=inst)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**3-2. llvm_builder.py** (Line 655-663 → 655-657)
|
|||
|
|
```python
|
|||
|
|
# Before: 9行の重複ロジック
|
|||
|
|
# After: type_helper.get_phi_dst_type(self, dst_vid)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**3-3. wiring.py** (Line 223-240 → 223-230)
|
|||
|
|
```python
|
|||
|
|
# Before: 18行の重複ロジック
|
|||
|
|
# After: type_helper.get_phi_dst_type(builder, dst_vid)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 効果
|
|||
|
|
|
|||
|
|
- ✅ **SSOT原則**: 型取得ロジックが1箇所に統一
|
|||
|
|
- ✅ **バグ防止**: 3箇所で同じロジック維持不要
|
|||
|
|
- ✅ **拡張性**: 新型追加が容易(1ファイル修正のみ)
|
|||
|
|
- ✅ **コード削減**: 27行 → 3行(import + 1行呼び出し)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 4: 型不一致警告強化 ✅
|
|||
|
|
|
|||
|
|
**ファイル**: `src/llvm_py/phi_wiring/wiring.py` (Line 63-79)
|
|||
|
|
|
|||
|
|
**変更内容**:
|
|||
|
|
|
|||
|
|
**Before** (Line 63-65):
|
|||
|
|
```python
|
|||
|
|
if os.environ.get('NYASH_PHI_TYPE_DEBUG') == '1':
|
|||
|
|
print(f"[phi_wiring/type_mismatch] v{dst_vid} predeclared PHI type {phi.type} != expected {expected_type}, creating new", file=sys.stderr)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**After** (Line 63-79):
|
|||
|
|
```python
|
|||
|
|
# Phase 275 P0: 型不一致の古いPHIを発見 → CRITICAL警告
|
|||
|
|
import sys
|
|||
|
|
print(f"⚠️ [phi_wiring/CRITICAL] PHI type mismatch! "
|
|||
|
|
f"v{dst_vid}: predeclared={phi.type} expected={expected_type}",
|
|||
|
|
file=sys.stderr)
|
|||
|
|
|
|||
|
|
# PhiManager に古いPHI無効化を通知(あれば)
|
|||
|
|
try:
|
|||
|
|
if hasattr(builder, 'phi_manager'):
|
|||
|
|
builder.phi_manager.invalidate_phi(int(block_id), int(dst_vid))
|
|||
|
|
except Exception:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
# 詳細デバッグ
|
|||
|
|
if os.environ.get('NYASH_PHI_TYPE_DEBUG') == '1':
|
|||
|
|
print(f"[phi_wiring/type_mismatch] Creating new PHI with correct type", file=sys.stderr)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- ✅ **バグ早期発見**: 型不一致が目立つ(⚠️ CRITICAL警告)
|
|||
|
|
- ✅ **メモリリーク防止**: PhiManager 経由で古いPHI無効化通知
|
|||
|
|
- ✅ **デバッグ性向上**: 環境変数なしでも重要警告は表示
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 テスト結果
|
|||
|
|
|
|||
|
|
### テスト実行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
NYASH_LLVM_USE_HARNESS=1 NYASH_DISABLE_PLUGINS=1 \
|
|||
|
|
./target/release/hakorune --backend llvm /tmp/test_p275_debug2.hako
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**結果**: ✅ `exit=3` (変更前と同じ動作)
|
|||
|
|
|
|||
|
|
### 型デバッグ出力確認
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
NYASH_PHI_TYPE_DEBUG=1 NYASH_LLVM_USE_HARNESS=1 NYASH_DISABLE_PLUGINS=1 \
|
|||
|
|
./target/release/hakorune --backend llvm /tmp/test_p275_debug2.hako 2>&1 | grep phi_wiring
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**出力**:
|
|||
|
|
```
|
|||
|
|
[phi_wiring/create] v28 dst_type=f64 -> phi_type=double
|
|||
|
|
[phi_wiring] v28 -> dst_type='f64'
|
|||
|
|
[phi_wiring/reuse] v28 predeclared PHI type matches: double
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**結果**: ✅ 型取得・PHI生成が正常動作
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 コード削減効果
|
|||
|
|
|
|||
|
|
### 型取得ロジック統一
|
|||
|
|
|
|||
|
|
| ファイル | Before | After | 削減 |
|
|||
|
|
|---------|--------|-------|------|
|
|||
|
|
| tagging.py | 直接取得 | type_helper呼び出し | - |
|
|||
|
|
| llvm_builder.py | 9行 | 2行 | -7行 |
|
|||
|
|
| wiring.py | 18行 | 5行 | -13行 |
|
|||
|
|
| **合計** | - | - | **-20行** |
|
|||
|
|
|
|||
|
|
### 新規ファイル追加
|
|||
|
|
|
|||
|
|
| ファイル | 行数 | 役割 |
|
|||
|
|
|---------|-----|------|
|
|||
|
|
| type_helper.py | 72行 | PHI型取得SSOT |
|
|||
|
|
|
|||
|
|
**ネット削減**: +72行(新規) - 20行(削減) = **+52行**
|
|||
|
|
|
|||
|
|
**SSOT効果**: 3箇所の重複ロジック → 1箇所の統一ロジック
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 次のステップ
|
|||
|
|
|
|||
|
|
### 推奨タスク(優先度順)
|
|||
|
|
|
|||
|
|
#### 1. box_from_f64 削除 (Phase 277 P0) ⭐ 推奨
|
|||
|
|
|
|||
|
|
**削除対象**:
|
|||
|
|
- `crates/nyash_kernel/src/lib.rs` Line 244-252
|
|||
|
|
- `crates/nyash_kernel/src/lib.rs` Line 971-982
|
|||
|
|
|
|||
|
|
**手順**:
|
|||
|
|
1. 最終テスト実行(スモークテスト + 回帰テスト)
|
|||
|
|
2. 削除コミット作成
|
|||
|
|
3. テスト再実行(削除後の動作確認)
|
|||
|
|
|
|||
|
|
**期待効果**:
|
|||
|
|
- デッドコード削除
|
|||
|
|
- メンテナンス負荷軽減
|
|||
|
|
|
|||
|
|
#### 2. dst_type_to_llvm_type 使用推進 (Phase 277 P1)
|
|||
|
|
|
|||
|
|
**現状**: `type_helper.py` に定義したが未使用
|
|||
|
|
|
|||
|
|
**使用箇所**:
|
|||
|
|
- `wiring.py` Line 100-105: `ensure_phi()` 内の型変換ロジック
|
|||
|
|
- `tagging.py`: PHI型変換箇所(あれば)
|
|||
|
|
|
|||
|
|
**効果**:
|
|||
|
|
- さらなるロジック統一
|
|||
|
|
- SSOT原則の完全適用
|
|||
|
|
|
|||
|
|
#### 3. 型推論パイプライン統一 (Phase 276 本体)
|
|||
|
|
|
|||
|
|
**現状**: Phase 276 README で計画中
|
|||
|
|
|
|||
|
|
**Phase 276 目標**:
|
|||
|
|
- 型伝播パイプラインのSSOT化
|
|||
|
|
- builder lifecycle / JoinIR→MIR bridge / LLVM harness の統一
|
|||
|
|
- パイプライン順序の決定性保証
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 設計原則の遵守
|
|||
|
|
|
|||
|
|
### ✅ Fail-Fast原則
|
|||
|
|
- 型不一致時に CRITICAL 警告(フォールバックなし)
|
|||
|
|
- エラーは明示的に失敗
|
|||
|
|
|
|||
|
|
### ✅ Box-First原則
|
|||
|
|
- PhiManager 経由で PHI 無効化通知
|
|||
|
|
- 直接削除を避ける
|
|||
|
|
|
|||
|
|
### ✅ SSOT原則
|
|||
|
|
- 型取得ロジックを1箇所に統一(type_helper.py)
|
|||
|
|
- 3ファイルでの重複ロジック削除
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎉 まとめ
|
|||
|
|
|
|||
|
|
Phase 276 P0 Quick Win 改善タスクを **完全実施**。
|
|||
|
|
|
|||
|
|
### 達成内容
|
|||
|
|
|
|||
|
|
1. ✅ デバッグスタックトレース削除
|
|||
|
|
2. ✅ box_from_f64 使用確認(削除可能と判断)
|
|||
|
|
3. ✅ 型取得ロジックSSOT化(type_helper.py 作成)
|
|||
|
|
4. ✅ 型不一致警告強化(CRITICAL警告追加)
|
|||
|
|
|
|||
|
|
### 効果
|
|||
|
|
|
|||
|
|
- **堅牢性向上**: SSOT化によるバグ防止
|
|||
|
|
- **保守性向上**: ロジック統一で拡張容易
|
|||
|
|
- **デバッグ性向上**: CRITICAL警告で問題早期発見
|
|||
|
|
|
|||
|
|
### 次のアクション
|
|||
|
|
|
|||
|
|
- **Phase 277 P0**: box_from_f64 削除(推奨)
|
|||
|
|
- **Phase 276 本体**: 型推論パイプライン統一(長期)
|