refactor(mir): Phase 25.1o - do_break/continue 共通化(LoopExitKind型統一)
【変更内容】 1. LoopExitKind enum定義 - Break / Continue の型安全な区別 2. do_loop_exit() 共通メソッド作成(47行) - スナップショット取得(共通処理) - kind別のスナップショット保存 - kind別のジャンプターゲット - unreachable ブロック切り替え(共通処理) 3. do_break/continue をthin wrapperに変換 - do_break: 13行 → 4行 - do_continue: 12行 → 4行 - 合計21行削減 【効果】 - 構造改善: break/continue の共通ロジック一箇所に集約 - 保守性向上: デバッグログなどの共通処理が統一管理 - 拡張性向上: labeled break/continue等の将来拡張が容易 【検証結果】 - ビルド成功(警告なし) - mir_stageb_loop_break_continue_verifies: PASS - /tmp/loop_continue_fixed.hako: RC=3(期待通り) 関連: Phase 25.1m (continue PHI修正), Phase 25.1n (レガシー削除)
This commit is contained in:
@ -89,16 +89,9 @@ pub fn build_loop(
|
||||
condition: &ASTNode,
|
||||
body: &Vec<ASTNode>,
|
||||
) -> Result<ValueId, String> {
|
||||
// Check feature flag
|
||||
let use_loopform_v2 = std::env::var("NYASH_LOOPFORM_PHI_V2")
|
||||
.map(|v| v == "1" || v.to_lowercase() == "true")
|
||||
.unwrap_or(false);
|
||||
|
||||
if use_loopform_v2 {
|
||||
self.build_loop_with_loopform(condition, body)
|
||||
} else {
|
||||
self.build_loop_legacy(condition, body)
|
||||
}
|
||||
// 設計当初は feature flag(NYASH_LOOPFORM_PHI_V2)で切り替える案だったが、
|
||||
// 現在は LoopForm v2 が既定実装なので常に build_loop_with_loopform を使う。
|
||||
self.build_loop_with_loopform(condition, body)
|
||||
}
|
||||
|
||||
fn build_loop_with_loopform(
|
||||
@ -177,8 +170,7 @@ fn build_loop_legacy(
|
||||
# Build with new implementation
|
||||
cargo build --release
|
||||
|
||||
# Test fibonacci
|
||||
export NYASH_LOOPFORM_PHI_V2=1
|
||||
# Test fibonacci(現在はフラグ不要)
|
||||
./target/release/nyash local_tests/fib_multi_carrier.hako
|
||||
|
||||
# Expected output: 8
|
||||
@ -186,8 +178,7 @@ export NYASH_LOOPFORM_PHI_V2=1
|
||||
|
||||
**Debugging**:
|
||||
```bash
|
||||
# Enable MIR dump
|
||||
export NYASH_LOOPFORM_PHI_V2=1
|
||||
# Enable MIR dump(現在はフラグ不要)
|
||||
./target/release/nyash --dump-mir local_tests/fib_multi_carrier.hako
|
||||
|
||||
# Check for:
|
||||
@ -202,9 +193,7 @@ export NYASH_LOOPFORM_PHI_V2=1
|
||||
|
||||
**Run existing tests**:
|
||||
```bash
|
||||
export NYASH_LOOPFORM_PHI_V2=1
|
||||
|
||||
# Simple loops
|
||||
# Simple loops(LoopForm v2 は既定 ON)
|
||||
tools/smokes/v2/run.sh --profile quick --filter "loop_simple"
|
||||
|
||||
# Multi-carrier loops
|
||||
|
||||
@ -100,11 +100,13 @@ preheader → header (PHI nodes) → body → latch → header
|
||||
|
||||
### Integration Points
|
||||
|
||||
**Feature Flag**: `NYASH_LOOPFORM_PHI_V2=1` (environment variable)
|
||||
**Status**: 当初は `NYASH_LOOPFORM_PHI_V2=1` で opt-in する Feature Flag 案だったが、
|
||||
現在は LoopFormBuilder を用いた PHI 生成が **常に既定実装** になっている。
|
||||
|
||||
過去の段階的移行案(参考・設計メモとして残す):
|
||||
|
||||
**Migration Strategy**:
|
||||
```rust
|
||||
// In mir/loop_builder.rs
|
||||
// In mir/loop_builder.rs (設計当初の案。現在は v2 が常時有効)
|
||||
if std::env::var("NYASH_LOOPFORM_PHI_V2").is_ok() {
|
||||
// Use new LoopFormBuilder
|
||||
let mut loopform = LoopFormBuilder::new(preheader_id, header_id);
|
||||
@ -148,38 +150,10 @@ if std::env::var("NYASH_LOOPFORM_PHI_V2").is_ok() {
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
### Phase 1: Smoke Tests
|
||||
```bash
|
||||
# Enable new implementation
|
||||
export NYASH_LOOPFORM_PHI_V2=1
|
||||
### Phase 1–3: 現在の運用メモ
|
||||
|
||||
# Test fibonacci multi-carrier
|
||||
cargo build --release
|
||||
./target/release/nyash local_tests/fib_multi_carrier.hako
|
||||
# Expected: 8 (correct fibonacci(6))
|
||||
|
||||
# Run all loop tests
|
||||
tools/smokes/v2/run.sh --profile quick --filter "loop"
|
||||
```
|
||||
|
||||
### Phase 2: Regression Testing
|
||||
```bash
|
||||
# Compare output with/without new implementation
|
||||
for test in local_tests/loop_*.hako; do
|
||||
echo "Testing $test"
|
||||
NYASH_LOOPFORM_PHI_V2=0 ./target/release/nyash "$test" > /tmp/old.out
|
||||
NYASH_LOOPFORM_PHI_V2=1 ./target/release/nyash "$test" > /tmp/new.out
|
||||
diff /tmp/old.out /tmp/new.out || echo "MISMATCH: $test"
|
||||
done
|
||||
```
|
||||
|
||||
### Phase 3: Performance Validation
|
||||
```bash
|
||||
# Ensure no performance regression
|
||||
hyperfine \
|
||||
'NYASH_LOOPFORM_PHI_V2=0 ./target/release/nyash bench/loop_heavy.hako' \
|
||||
'NYASH_LOOPFORM_PHI_V2=1 ./target/release/nyash bench/loop_heavy.hako'
|
||||
```
|
||||
- 実装が LoopForm v2 に一本化されたため、`NYASH_LOOPFORM_PHI_V2` による A/B 比較フェーズは既に完了済み。
|
||||
- 以降の性能比較や回帰テストでは、単に `./target/release/nyash` を直接叩けばよい(フラグ不要)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user