198 lines
6.1 KiB
Markdown
198 lines
6.1 KiB
Markdown
|
|
# Phase 58: OWNERSHIP-PLUMB-P2-DEV Summary
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
Phase 58 adds a dev-only conversion layer between OwnershipAnalyzer (Phase 57) and P2 lowering infrastructure. This establishes the foundation for ownership-based carrier analysis without modifying the actual lowering path yet.
|
||
|
|
|
||
|
|
## What Was Added
|
||
|
|
|
||
|
|
### 1. `plan_to_lowering.rs` Module
|
||
|
|
|
||
|
|
**Location**: `src/mir/join_ir/ownership/plan_to_lowering.rs` (~210 lines)
|
||
|
|
|
||
|
|
**Purpose**: Convert `OwnershipPlan` to `P2LoweringInputs` (CarrierInfo-compatible structure).
|
||
|
|
|
||
|
|
**Key Components**:
|
||
|
|
|
||
|
|
```rust
|
||
|
|
pub struct P2LoweringInputs {
|
||
|
|
pub carriers: Vec<CarrierVar>, // Derived from owned_vars (is_written=true)
|
||
|
|
pub captures: Vec<String>, // Read-only captures
|
||
|
|
pub condition_captures: Vec<String>, // Subset used in conditions
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn plan_to_p2_inputs(
|
||
|
|
plan: &OwnershipPlan,
|
||
|
|
loop_var: &str,
|
||
|
|
) -> Result<P2LoweringInputs, String>
|
||
|
|
```
|
||
|
|
|
||
|
|
**Conversion Rules**:
|
||
|
|
- **owned_vars** where `is_written=true` → **carriers**
|
||
|
|
- Loop variable skipped (pinned, handled separately)
|
||
|
|
- `is_condition_only=true` → `CarrierRole::ConditionOnly`
|
||
|
|
- `is_condition_only=false` → `CarrierRole::LoopState`
|
||
|
|
- **captures** → **captures** (read-only variables)
|
||
|
|
- **condition_captures** → **condition_captures**
|
||
|
|
|
||
|
|
**Fail-Fast Constraint**:
|
||
|
|
- **relay_writes non-empty** → immediate error
|
||
|
|
- Phase 58 scope limitation: relay not yet supported
|
||
|
|
- Will be lifted in Phase 60+ when relay infrastructure is ready
|
||
|
|
|
||
|
|
### 2. Integration Test
|
||
|
|
|
||
|
|
**Location**: `tests/normalized_joinir_min.rs` (test_phase58_ownership_p2_comparison)
|
||
|
|
|
||
|
|
**Test Strategy**:
|
||
|
|
1. **Relay rejection test**: Verifies Fail-Fast behavior when relay_writes exists
|
||
|
|
2. **Loop-local carrier test**: Verifies successful conversion when all variables are loop-owned
|
||
|
|
|
||
|
|
**What It Validates**:
|
||
|
|
- OwnershipAnalyzer can analyze P2 fixtures (JSON AST)
|
||
|
|
- plan_to_p2_inputs can convert OwnershipPlan to reasonable CarrierVar structures
|
||
|
|
- Fail-Fast error handling works correctly
|
||
|
|
|
||
|
|
**What It Does NOT Do**:
|
||
|
|
- Does NOT modify actual lowering path
|
||
|
|
- Does NOT replace existing CarrierInfo construction
|
||
|
|
- Does NOT run VM execution comparisons (analysis-only)
|
||
|
|
|
||
|
|
### 3. Updated Module Exports
|
||
|
|
|
||
|
|
**Location**: `src/mir/join_ir/ownership/mod.rs`
|
||
|
|
|
||
|
|
**Changes**:
|
||
|
|
```rust
|
||
|
|
#[cfg(feature = "normalized_dev")]
|
||
|
|
mod plan_to_lowering;
|
||
|
|
|
||
|
|
#[cfg(feature = "normalized_dev")]
|
||
|
|
pub use plan_to_lowering::*;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Entry Point Strategy
|
||
|
|
|
||
|
|
**Analysis-Based Testing Only**:
|
||
|
|
- Entry point: `test_phase58_ownership_p2_comparison()` test
|
||
|
|
- Demonstrates OwnershipAnalyzer → plan_to_p2_inputs pipeline works
|
||
|
|
- Does NOT modify actual lowering behavior
|
||
|
|
- No runtime integration yet (Phase 60+ scope)
|
||
|
|
|
||
|
|
**Why This Approach**:
|
||
|
|
1. **Validation First**: Prove analysis is correct before changing lowering
|
||
|
|
2. **Risk Isolation**: New code can't break existing tests
|
||
|
|
3. **Incremental Progress**: Small, testable steps
|
||
|
|
4. **Clear Rollback**: Easy to revert if analysis is wrong
|
||
|
|
|
||
|
|
## Key Constraints
|
||
|
|
|
||
|
|
### 1. Feature-Gated
|
||
|
|
```rust
|
||
|
|
#[cfg(feature = "normalized_dev")]
|
||
|
|
```
|
||
|
|
All new code under `normalized_dev` feature flag.
|
||
|
|
|
||
|
|
### 2. No Behavioral Change
|
||
|
|
- Existing tests: **946+ passing** (unchanged)
|
||
|
|
- New tests: **Analyzer + converter compile successfully**
|
||
|
|
- No modification to existing lowering paths
|
||
|
|
|
||
|
|
### 3. Fail-Fast on Relay
|
||
|
|
```rust
|
||
|
|
if !plan.relay_writes.is_empty() {
|
||
|
|
return Err("relay_writes not yet supported");
|
||
|
|
}
|
||
|
|
```
|
||
|
|
- Immediately rejects relay scenarios
|
||
|
|
- Prevents silent bugs from incomplete relay handling
|
||
|
|
- Will be lifted in Phase 60+ when relay infrastructure is complete
|
||
|
|
|
||
|
|
### 4. Analysis Only
|
||
|
|
- Produces CarrierVar structures but doesn't use them yet
|
||
|
|
- Validates structure compatibility with existing CarrierInfo
|
||
|
|
- Full integration deferred to Phase 60+
|
||
|
|
|
||
|
|
## Build and Test Results
|
||
|
|
|
||
|
|
### Build Status
|
||
|
|
```bash
|
||
|
|
cargo build --release
|
||
|
|
# ✅ Success (0 errors, 1m 13s)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Ownership Tests
|
||
|
|
```bash
|
||
|
|
cargo test --release --lib ownership
|
||
|
|
# ✅ 7 tests passed (analyzer + types tests)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Integration Tests
|
||
|
|
```bash
|
||
|
|
cargo test --release --features normalized_dev --test normalized_joinir_min
|
||
|
|
# ✅ Compiles successfully (tests require NYASH_JOINIR_NORMALIZED_DEV_RUN=1 to run)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Path to Phase 60+
|
||
|
|
|
||
|
|
### Phase 59: P3/P4 Conversion
|
||
|
|
- Add `plan_to_p3_inputs()` and `plan_to_p4_inputs()`
|
||
|
|
- Extend tests to cover Pattern 3 (if-else) and Pattern 4 (continue)
|
||
|
|
- Still analysis-only (no lowering modification)
|
||
|
|
|
||
|
|
### Phase 60: Lowering Integration
|
||
|
|
- Create alternate lowering entry point that uses OwnershipPlan
|
||
|
|
- Run both paths (old + new) in parallel
|
||
|
|
- Compare VM results for equivalence
|
||
|
|
- Gate with feature flag + env var for safety
|
||
|
|
|
||
|
|
### Phase 61+: Relay Support
|
||
|
|
- Implement relay carrier forwarding in lowering
|
||
|
|
- Lift Fail-Fast constraint on relay_writes
|
||
|
|
- Handle nested loop scenarios
|
||
|
|
|
||
|
|
## Files Created/Modified
|
||
|
|
|
||
|
|
### Created
|
||
|
|
- `src/mir/join_ir/ownership/plan_to_lowering.rs` (~210 lines)
|
||
|
|
- `docs/development/current/main/PHASE_58_SUMMARY.md` (this file)
|
||
|
|
|
||
|
|
### Modified
|
||
|
|
- `src/mir/join_ir/ownership/mod.rs` (+4 lines: module + pub use)
|
||
|
|
- `tests/normalized_joinir_min.rs` (+174 lines: test_phase58_ownership_p2_comparison)
|
||
|
|
|
||
|
|
## Technical Decisions
|
||
|
|
|
||
|
|
### Why `FromHost` for init?
|
||
|
|
```rust
|
||
|
|
init: CarrierInit::FromHost, // Default (Phase 228)
|
||
|
|
```
|
||
|
|
- Phase 228 default: use host_id value for initialization
|
||
|
|
- `LoopLocalZero` reserved for Phase 60+ (loop-local derived carriers)
|
||
|
|
- `BoolConst` reserved for ConditionOnly promoted carriers (Phase 227)
|
||
|
|
|
||
|
|
### Why skip loop variable?
|
||
|
|
```rust
|
||
|
|
if var.name == loop_var {
|
||
|
|
continue; // Pinned, handled separately
|
||
|
|
}
|
||
|
|
```
|
||
|
|
- Loop variable has special handling (pinned in LoopScopeShape)
|
||
|
|
- Not included in carriers list
|
||
|
|
- Consistent with existing CarrierInfo behavior
|
||
|
|
|
||
|
|
### Why Fail-Fast on relay?
|
||
|
|
- **Correctness**: Incomplete relay handling → silent bugs
|
||
|
|
- **Clarity**: Explicit error better than undefined behavior
|
||
|
|
- **Progress**: Enables incremental implementation (relay in Phase 61+)
|
||
|
|
|
||
|
|
## Conclusion
|
||
|
|
|
||
|
|
Phase 58 successfully establishes the ownership-to-lowering conversion layer for P2:
|
||
|
|
- ✅ Converter implemented and tested (analysis-only)
|
||
|
|
- ✅ Fail-Fast constraints clearly defined
|
||
|
|
- ✅ No behavioral changes to existing code
|
||
|
|
- ✅ Clear path forward to Phase 60+ integration
|
||
|
|
|
||
|
|
**Next Steps**: Phase 59 (P3/P4 conversion), then Phase 60 (lowering integration).
|