phase29ao(p25): strict/dev adopt pattern5 from facts
This commit is contained in:
@ -18,9 +18,12 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
|
||||
**CorePlan migration 道筋 SSOT**
|
||||
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
|
||||
|
||||
**Next implementation (Phase 29ao P25)**
|
||||
- 目的: Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知する(既定挙動は不変)
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
**Next implementation (Phase 29ao P26)**
|
||||
- 目的: TBD
|
||||
- 指示書: TBD
|
||||
|
||||
**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)**
|
||||
Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)**
|
||||
Pattern7(SplitScan)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
|
||||
|
||||
@ -2,12 +2,17 @@
|
||||
|
||||
## Current Focus: Phase 29ao(CorePlan composition)
|
||||
|
||||
Next: Phase 29ao P25(Pattern5 strict/dev adopt from facts)
|
||||
指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
Next: Phase 29ao P26(TBD)
|
||||
指示書: TBD
|
||||
運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
|
||||
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
|
||||
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
**2025-12-30: Phase 29ao P25 完了** ✅
|
||||
- 目的: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知
|
||||
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` / `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
**2025-12-30: Phase 29ao P24 完了** ✅
|
||||
- 目的: Pattern7 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知
|
||||
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
|
||||
|
||||
@ -15,8 +15,8 @@ Related:
|
||||
|
||||
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- 状況: P0–P24 ✅ 完了 / Next: P25(Pattern5 strict/dev adopt from facts)
|
||||
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- 状況: P0–P25 ✅ 完了 / Next: P26(TBD)
|
||||
- Next 指示書: TBD
|
||||
|
||||
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
|
||||
|
||||
@ -34,7 +34,7 @@ Related:
|
||||
## 1.1 Current (active)
|
||||
|
||||
- Active phase: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- Next step: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- Next step: TBD
|
||||
|
||||
## 2. すでに固めた SSOT(再発防止の土台)
|
||||
|
||||
|
||||
@ -10,6 +10,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。
|
||||
- Pattern1 (strict shadow, VM): `phase29ao_pattern1_strict_shadow_vm`
|
||||
- Pattern1 (subset reject, VM): `phase29ao_pattern1_subset_reject_extra_stmt_vm`
|
||||
- Pattern5 (Break, VM): `phase286_pattern5_break_vm`
|
||||
- Pattern5 (strict shadow, VM): `phase29ao_pattern5_strict_shadow_vm`
|
||||
- Pattern6: `phase29ab_pattern6_*`
|
||||
- Pattern7: `phase29ab_pattern7_*`
|
||||
- Merge/Phi代表: `apps/tests/phase1883_nested_minimal.hako`(RC=9)
|
||||
|
||||
@ -147,13 +147,11 @@ Gate(SSOT):
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P24-STRICT-ADOPT-PATTERN7-SPLITSCAN-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- ねらい: Pattern7 を strict/dev で Facts→CorePlan に寄せ、fallback/近似マッチによるズレを早期検知(既定挙動は不変)
|
||||
|
||||
## P25: strict/dev Pattern5 adopt from facts(Infinite Early-Exit)
|
||||
## P25: strict/dev Pattern5 adopt from facts(Infinite Early-Exit)✅
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- ねらい: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知(既定挙動は不変)
|
||||
|
||||
## Next(planned)
|
||||
|
||||
- Next: P25(実装)
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
|
||||
- After P25: P26(TBD)
|
||||
- P26: TBD
|
||||
|
||||
@ -398,6 +398,28 @@ pub(crate) fn route_loop_pattern(
|
||||
return PlanLowerer::lower(builder, core_plan, ctx);
|
||||
}
|
||||
|
||||
if strict_or_dev
|
||||
&& matches!(
|
||||
domain_plan,
|
||||
crate::mir::builder::control_flow::plan::DomainPlan::Pattern5InfiniteEarlyExit(_)
|
||||
)
|
||||
{
|
||||
let facts = outcome
|
||||
.facts
|
||||
.as_ref()
|
||||
.ok_or_else(|| "pattern5 strict/dev adopt failed: facts missing".to_string())?;
|
||||
if facts.facts.pattern5_infinite_early_exit.is_none() {
|
||||
return Err("pattern5 strict/dev adopt failed: facts mismatch".to_string());
|
||||
}
|
||||
let core_plan =
|
||||
PlanNormalizer::normalize_pattern5_infinite_early_exit_from_facts(builder, facts, ctx)?
|
||||
.ok_or_else(|| {
|
||||
"pattern5 strict/dev adopt failed: compose rejected".to_string()
|
||||
})?;
|
||||
PlanVerifier::verify(&core_plan)?;
|
||||
return PlanLowerer::lower(builder, core_plan, ctx);
|
||||
}
|
||||
|
||||
return lower_via_plan(builder, domain_plan, ctx);
|
||||
}
|
||||
|
||||
|
||||
@ -8,12 +8,28 @@ use crate::mir::builder::control_flow::edgecfg::api::{
|
||||
BlockParams, BranchStub, EdgeStub, ExitKind, Frag,
|
||||
};
|
||||
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
|
||||
use crate::mir::builder::control_flow::plan::facts::pattern5_infinite_early_exit_facts::Pattern5InfiniteEarlyExitFacts;
|
||||
use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
|
||||
use crate::mir::builder::MirBuilder;
|
||||
use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout;
|
||||
use crate::mir::{ConstValue, MirType, ValueId};
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
impl super::PlanNormalizer {
|
||||
pub(in crate::mir::builder) fn normalize_pattern5_infinite_early_exit_from_facts(
|
||||
builder: &mut MirBuilder,
|
||||
facts: &CanonicalLoopFacts,
|
||||
ctx: &LoopPatternContext,
|
||||
) -> Result<Option<CorePlan>, String> {
|
||||
let Some(pattern5) = facts.facts.pattern5_infinite_early_exit.as_ref() else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let parts = plan_from_facts(pattern5);
|
||||
let core_plan = Self::normalize_pattern5_infinite_early_exit(builder, parts, ctx)?;
|
||||
Ok(Some(core_plan))
|
||||
}
|
||||
|
||||
/// Pattern5InfiniteEarlyExit → CorePlan 変換 (Phase 286 P3.2)
|
||||
///
|
||||
/// Expands infinite loop with early exit into CorePlan.
|
||||
@ -555,3 +571,15 @@ impl super::PlanNormalizer {
|
||||
Ok(CorePlan::Loop(loop_plan))
|
||||
}
|
||||
}
|
||||
|
||||
fn plan_from_facts(facts: &Pattern5InfiniteEarlyExitFacts) -> Pattern5InfiniteEarlyExitPlan {
|
||||
Pattern5InfiniteEarlyExitPlan {
|
||||
loop_var: facts.loop_var.clone(),
|
||||
exit_kind: facts.exit_kind,
|
||||
exit_condition: facts.exit_condition.clone(),
|
||||
exit_value: facts.exit_value.clone(),
|
||||
carrier_var: facts.carrier_var.clone(),
|
||||
carrier_update: facts.carrier_update.clone(),
|
||||
loop_increment: facts.loop_increment.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,6 +23,7 @@ run_filter "pattern3_ifphi_vm" "phase118_pattern3_if_sum_vm" || exit 1
|
||||
run_filter "pattern1_strict_shadow_vm" "phase29ao_pattern1_strict_shadow_vm" || exit 1
|
||||
run_filter "pattern1_subset_reject_extra_stmt_vm" "phase29ao_pattern1_subset_reject_extra_stmt_vm" || exit 1
|
||||
run_filter "pattern5_break_vm" "phase286_pattern5_break_vm" || exit 1
|
||||
run_filter "pattern5_strict_shadow_vm" "phase29ao_pattern5_strict_shadow_vm" || exit 1
|
||||
run_filter "pattern6" "phase29ab_pattern6_" || exit 1
|
||||
run_filter "pattern7" "phase29ab_pattern7_" || exit 1
|
||||
run_filter "phase1883" "phase1883_" || exit 1
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
# phase29ao_pattern5_strict_shadow_vm.sh - Pattern5 strict shadow adopt gate (VM)
|
||||
#
|
||||
# Expected:
|
||||
# - Output "3" or "RC: 3"
|
||||
|
||||
source "$(dirname "$0")/../../../lib/test_runner.sh"
|
||||
require_env || exit 2
|
||||
|
||||
FIXTURE="$NYASH_ROOT/apps/tests/phase286_pattern5_break_min.hako"
|
||||
RUN_TIMEOUT_SECS=${RUN_TIMEOUT_SECS:-10}
|
||||
|
||||
set +e
|
||||
OUTPUT=$(timeout "$RUN_TIMEOUT_SECS" env NYASH_DISABLE_PLUGINS=1 HAKO_JOINIR_STRICT=1 "$NYASH_BIN" "$FIXTURE" 2>&1)
|
||||
EXIT_CODE=$?
|
||||
set -e
|
||||
|
||||
if [ "$EXIT_CODE" -eq 124 ]; then
|
||||
test_fail "phase29ao_pattern5_strict_shadow_vm: hakorune timed out (>${RUN_TIMEOUT_SECS}s)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if echo "$OUTPUT" | grep -qE "(^3$|RC: 3$)"; then
|
||||
test_pass "phase29ao_pattern5_strict_shadow_vm: PASS (output: 3)"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "[FAIL] Unexpected output (expected: 3)"
|
||||
echo "[INFO] Exit code: $EXIT_CODE"
|
||||
echo "[INFO] Output:"
|
||||
echo "$OUTPUT" | head -n 20 || true
|
||||
test_fail "phase29ao_pattern5_strict_shadow_vm: Unexpected output"
|
||||
exit 1
|
||||
Reference in New Issue
Block a user