phase29ao(p40): release adopt pattern3 if-phi subset

This commit is contained in:
2025-12-30 18:16:52 +09:00
parent 6000c5c3f9
commit eef061ad2b
10 changed files with 110 additions and 5 deletions

View File

@ -3,7 +3,7 @@
## Current Focus
- Phase: `docs/development/current/main/phases/phase-29ao/README.md`
- Next: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
- Next: TBD (see `docs/development/current/main/phases/phase-29ao/README.md`)
## Gate (SSOT)

View File

@ -5,7 +5,7 @@ Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/dev
## Active
- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`Next: P40
- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`Next: TBD
## Near-Term Candidates

View File

@ -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/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
- Next step: TBD
## 2. すでに固めた SSOT再発防止の土台

View File

@ -9,6 +9,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。
- Pattern2 (subset, strict shadow, VM): `phase29ai_pattern2_break_plan_subset_ok_min_vm`
- Pattern2 (release adopt, VM): `phase29ao_pattern2_release_adopt_vm`
- Pattern3 (IfPhi, VM): `phase118_pattern3_if_sum_vm`
- Pattern3 (release adopt, VM): `phase29ao_pattern3_release_adopt_vm`
- 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`

View File

@ -221,7 +221,11 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P39-RELEASE-ADOPT-PATTERN2-BREAK-SUBSET-INSTRUCTIONS.md`
- ねらい: Pattern2 planner subset を release 既定で Facts→CorePlan に採用し、非strict経路の回帰を追加仕様不変
## P40: Stage-2 expand — release adopt Pattern3 (IfPhi) subset ✅
- 指示書: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
- ねらい: Pattern3 planner subset を release 既定で Facts→CorePlan に採用し、非strict経路の回帰を追加仕様不変
## Nextplanned
- Next: P40Stage-2 expand: Pattern3
- 指示書: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
- Next: TBD

View File

@ -392,6 +392,17 @@ pub(crate) fn route_loop_pattern(
PlanVerifier::verify(&core_plan)?;
return PlanLowerer::lower(builder, core_plan, ctx);
}
if let Some(core_plan) =
composer::try_release_adopt_core_plan_for_pattern3_ifphi(
builder,
ctx,
&domain_plan,
&outcome,
)?
{
PlanVerifier::verify(&core_plan)?;
return PlanLowerer::lower(builder, core_plan, ctx);
}
}
return lower_via_plan(builder, domain_plan, ctx);

View File

@ -12,6 +12,7 @@ use crate::mir::builder::MirBuilder;
pub(in crate::mir::builder) use shadow_adopt::{
try_release_adopt_core_plan_for_pattern1,
try_release_adopt_core_plan_for_pattern2_break_subset,
try_release_adopt_core_plan_for_pattern3_ifphi,
try_release_adopt_core_plan_for_pattern6_scan_with_init,
try_release_adopt_core_plan_for_pattern7_split_scan,
try_shadow_adopt_core_plan,

View File

@ -130,6 +130,32 @@ pub(in crate::mir::builder) fn try_release_adopt_core_plan_for_pattern2_break_su
}
}
pub(in crate::mir::builder) fn try_release_adopt_core_plan_for_pattern3_ifphi(
builder: &mut MirBuilder,
ctx: &LoopPatternContext,
domain_plan: &DomainPlan,
outcome: &PlanBuildOutcome,
) -> Result<Option<CorePlan>, String> {
if !matches!(domain_plan, DomainPlan::Pattern3IfPhi(_)) {
return Ok(None);
}
if !matches!(outcome.plan.as_ref(), Some(DomainPlan::Pattern3IfPhi(_))) {
return Ok(None);
}
let Some(facts) = outcome.facts.as_ref() else {
return Ok(None);
};
if facts.facts.pattern3_ifphi.is_none() {
return Ok(None);
}
match compose_coreplan_for_pattern3_ifphi(builder, facts, ctx) {
Ok(Some(core)) => Ok(Some(core)),
Ok(None) | Err(_) => Ok(None),
}
}
pub(in crate::mir::builder) fn compose_coreplan_for_pattern2_break_subset(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,

View File

@ -22,6 +22,7 @@ run_filter "pattern2_realworld" "phase263_pattern2_" || exit 1
run_filter "pattern2_subset" "phase29ai_pattern2_break_plan_subset_ok_min_vm" || exit 1
run_filter "pattern2_release_adopt_vm" "phase29ao_pattern2_release_adopt_vm" || exit 1
run_filter "pattern3_ifphi_vm" "phase118_pattern3_if_sum_vm" || exit 1
run_filter "pattern3_release_adopt_vm" "phase29ao_pattern3_release_adopt_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

View File

@ -0,0 +1,61 @@
#!/bin/bash
# phase29ao_pattern3_release_adopt_vm.sh - Pattern3 release adopt path smoke (VM)
#
# Expected:
# - Exit code 0
# - Output matches expected (12)
# - No shadow adopt tag
source "$(dirname "$0")/../../../lib/test_runner.sh"
source "$(dirname "$0")/../../../lib/output_validator.sh"
export SMOKES_USE_PYVM=0
require_env || exit 2
RUN_TIMEOUT_SECS=${RUN_TIMEOUT_SECS:-10}
INPUT="$NYASH_ROOT/apps/tests/phase118_pattern3_if_sum_min.hako"
EXPECTED="12"
TAG='[coreplan/shadow_adopt:pattern3_ifphi]'
set +e
OUTPUT=$(timeout "$RUN_TIMEOUT_SECS" env \
-u HAKO_JOINIR_STRICT \
-u NYASH_JOINIR_STRICT \
-u HAKO_JOINIR_DEBUG \
-u NYASH_JOINIR_DEBUG \
-u NYASH_JOINIR_DEV \
NYASH_DISABLE_PLUGINS=1 \
"$NYASH_BIN" --backend vm "$INPUT" 2>&1)
EXIT_CODE=$?
set -e
if [ "$EXIT_CODE" -eq 124 ]; then
test_fail "phase29ao_pattern3_release_adopt_vm: hakorune timed out (>${RUN_TIMEOUT_SECS}s)"
exit 1
fi
if [ "$EXIT_CODE" -ne 0 ]; then
echo "[FAIL] hakorune failed with exit code $EXIT_CODE"
echo "[INFO] output (tail):"
echo "$OUTPUT" | tail -n 80 || true
test_fail "phase29ao_pattern3_release_adopt_vm: execution failed"
exit 1
fi
if echo "$OUTPUT" | grep -qF "$TAG"; then
echo "[FAIL] Unexpected tag: $TAG"
echo "[INFO] output (tail):"
echo "$OUTPUT" | tail -n 80 || true
test_fail "phase29ao_pattern3_release_adopt_vm: tag should not appear in release"
exit 1
fi
if validate_numeric_output 1 "$EXPECTED" "$OUTPUT"; then
test_pass "phase29ao_pattern3_release_adopt_vm: output matches expected (12)"
exit 0
fi
echo "[INFO] output (tail):"
echo "$OUTPUT" | tail -n 80 || true
test_fail "phase29ao_pattern3_release_adopt_vm: output mismatch"
exit 1