feat(joinir): Phase 213-2 Step 2-2 & 2-3 Data structure extensions
Extended PatternPipelineContext and CarrierUpdateInfo for Pattern 3 AST-based generalization. Changes: 1. PatternPipelineContext: - Added loop_condition: Option<ASTNode> - Added loop_body: Option<Vec<ASTNode>> - Added loop_update_summary: Option<LoopUpdateSummary> - Updated build_pattern_context() for Pattern 3 2. CarrierUpdateInfo: - Added then_expr: Option<ASTNode> - Added else_expr: Option<ASTNode> - Updated analyze_loop_updates() with None defaults Status: Phase 213-2 Steps 2-2 & 2-3 complete Next: Create Pattern3IfAnalyzer to extract if statement and populate update summary
This commit is contained in:
@ -783,6 +783,76 @@ fn verify_exit_line(
|
||||
}
|
||||
}
|
||||
|
||||
/// Phase 205-4: Verify ValueId regions follow JoinValueSpace contracts
|
||||
///
|
||||
/// # Checks
|
||||
///
|
||||
/// 1. All `boundary.join_inputs` are in Param region (100-999)
|
||||
/// 2. All `carrier_phis[].phi_dst` are within valid range (<= LOCAL_MAX)
|
||||
/// 3. All `condition_bindings[].join_value` are in Param region
|
||||
///
|
||||
/// # Rationale
|
||||
///
|
||||
/// JoinValueSpace enforces disjoint regions (Param: 100-999, Local: 1000+)
|
||||
/// to prevent ValueId collisions. This verifier ensures that the boundary
|
||||
/// contracts are respected after JoinIR generation.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics in debug mode if any ValueId is in an unexpected region.
|
||||
#[cfg(debug_assertions)]
|
||||
fn verify_valueid_regions(
|
||||
loop_info: &LoopHeaderPhiInfo,
|
||||
boundary: &JoinInlineBoundary,
|
||||
) {
|
||||
use crate::mir::join_ir::lowering::join_value_space::{PARAM_MIN, PARAM_MAX, LOCAL_MAX};
|
||||
|
||||
// Helper to classify region
|
||||
fn region_name(id: ValueId) -> &'static str {
|
||||
if id.0 < PARAM_MIN {
|
||||
"PHI Reserved"
|
||||
} else if id.0 <= PARAM_MAX {
|
||||
"Param"
|
||||
} else if id.0 <= LOCAL_MAX {
|
||||
"Local"
|
||||
} else {
|
||||
"Invalid (> LOCAL_MAX)"
|
||||
}
|
||||
}
|
||||
|
||||
// Check 1: Boundary join_inputs must be in Param region
|
||||
for join_id in &boundary.join_inputs {
|
||||
if join_id.0 < PARAM_MIN || join_id.0 > PARAM_MAX {
|
||||
panic!(
|
||||
"[RegionVerifier] Boundary input {:?} is in {} region, expected Param (100-999)",
|
||||
join_id, region_name(*join_id)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Check 2: Condition bindings must be in Param region
|
||||
for binding in &boundary.condition_bindings {
|
||||
let join_value = binding.join_value;
|
||||
if join_value.0 < PARAM_MIN || join_value.0 > PARAM_MAX {
|
||||
panic!(
|
||||
"[RegionVerifier] Condition binding '{}' join_value {:?} is in {} region, expected Param (100-999)",
|
||||
binding.name, join_value, region_name(join_value)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Check 3: PHI dst must be within valid range
|
||||
for (carrier_name, entry) in &loop_info.carrier_phis {
|
||||
let phi_dst = entry.phi_dst;
|
||||
if phi_dst.0 > LOCAL_MAX {
|
||||
panic!(
|
||||
"[RegionVerifier] Carrier '{}' PHI dst {:?} exceeds LOCAL_MAX ({})",
|
||||
carrier_name, phi_dst, LOCAL_MAX
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Verify that PHI dst values are not overwritten by later instructions (Phase 204-2)
|
||||
///
|
||||
/// # Checks
|
||||
@ -957,4 +1027,5 @@ fn verify_joinir_contracts(
|
||||
verify_no_phi_dst_overwrite(func, header_block, loop_info); // Phase 204-2
|
||||
verify_phi_inputs_defined(func, header_block); // Phase 204-3
|
||||
verify_exit_line(func, exit_block, boundary);
|
||||
verify_valueid_regions(loop_info, boundary); // Phase 205-4
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user