phase29ao(p40): release adopt pattern3 if-phi subset
This commit is contained in:
@ -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)
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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(再発防止の土台)
|
||||
|
||||
|
||||
@ -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 (If‑Phi, 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`
|
||||
|
||||
@ -221,7 +221,11 @@ Gate(SSOT):
|
||||
- 指示書: `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 (If‑Phi) subset ✅
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
|
||||
- ねらい: Pattern3 planner subset を release 既定で Facts→CorePlan に採用し、非strict経路の回帰を追加(仕様不変)
|
||||
|
||||
## Next(planned)
|
||||
|
||||
- Next: P40(Stage-2 expand: Pattern3)
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
|
||||
- Next: TBD
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
Reference in New Issue
Block a user