108 lines
3.3 KiB
Rust
108 lines
3.3 KiB
Rust
|
|
//! Pattern 1: Simple While Loop → JoinIR Lowering
|
||
|
|
//!
|
||
|
|
//! Phase 188 Task 188-4: Implementation of simple while loop pattern.
|
||
|
|
//!
|
||
|
|
//! ## Pattern Characteristics
|
||
|
|
//!
|
||
|
|
//! - Single loop variable (carrier)
|
||
|
|
//! - Simple condition
|
||
|
|
//! - NO control flow statements (no break, no continue, no nested if)
|
||
|
|
//! - Natural exit only (condition becomes false)
|
||
|
|
//!
|
||
|
|
//! ## Example
|
||
|
|
//!
|
||
|
|
//! ```nyash
|
||
|
|
//! local i = 0
|
||
|
|
//! loop(i < 3) {
|
||
|
|
//! print(i)
|
||
|
|
//! i = i + 1
|
||
|
|
//! }
|
||
|
|
//! return 0
|
||
|
|
//! ```
|
||
|
|
//!
|
||
|
|
//! ## JoinIR Transformation
|
||
|
|
//!
|
||
|
|
//! ```text
|
||
|
|
//! fn main():
|
||
|
|
//! i_init = 0
|
||
|
|
//! return loop_step(i_init)
|
||
|
|
//!
|
||
|
|
//! fn loop_step(i):
|
||
|
|
//! exit_cond = !(i < 3)
|
||
|
|
//! Jump(k_exit, [], cond=exit_cond) // early return
|
||
|
|
//! print(i)
|
||
|
|
//! i_next = i + 1
|
||
|
|
//! Call(loop_step, [i_next]) // tail recursion
|
||
|
|
//!
|
||
|
|
//! fn k_exit():
|
||
|
|
//! return 0
|
||
|
|
//! ```
|
||
|
|
|
||
|
|
use crate::mir::join_ir::lowering::loop_scope_shape::LoopScopeShape;
|
||
|
|
use crate::mir::join_ir::{
|
||
|
|
ConstValue, JoinContId, JoinFuncId, JoinFunction, JoinInst, JoinModule, MirLikeInst, UnaryOp,
|
||
|
|
};
|
||
|
|
use crate::mir::ValueId;
|
||
|
|
|
||
|
|
/// Pattern detection: Simple While Loop
|
||
|
|
///
|
||
|
|
/// Criteria:
|
||
|
|
/// - No break statements (break_targets.is_empty())
|
||
|
|
/// - No continue statements (continue_targets.is_empty())
|
||
|
|
/// - Has at least one carrier variable
|
||
|
|
///
|
||
|
|
/// # Returns
|
||
|
|
///
|
||
|
|
/// - `true`: Pattern matches (safe to call lower_simple_while_pattern)
|
||
|
|
/// - `false`: Pattern does not match (try other patterns)
|
||
|
|
pub fn is_simple_while_pattern(_scope: &LoopScopeShape) -> bool {
|
||
|
|
// Phase 188: Pattern detection logic will be implemented after understanding
|
||
|
|
// LoopScopeShape structure better. For now, return false to avoid breaking existing code.
|
||
|
|
// TODO: Implement proper detection based on break_targets, continue_targets, and carriers.
|
||
|
|
false
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Lower simple while loop to JoinIR
|
||
|
|
///
|
||
|
|
/// Transforms a simple while loop (Pattern 1) into JoinIR representation:
|
||
|
|
/// - Loop → tail-recursive function (loop_step)
|
||
|
|
/// - Exit condition → conditional Jump to k_exit
|
||
|
|
/// - Loop body → sequential Compute instructions
|
||
|
|
/// - Backedge → tail Call to loop_step
|
||
|
|
///
|
||
|
|
/// # Arguments
|
||
|
|
///
|
||
|
|
/// - `scope`: LoopScopeShape containing loop structure and variable classification
|
||
|
|
///
|
||
|
|
/// # Returns
|
||
|
|
///
|
||
|
|
/// - `Some(JoinModule)`: Successfully lowered to JoinIR
|
||
|
|
/// - `None`: Lowering failed (try other patterns or fallback)
|
||
|
|
pub fn lower_simple_while_pattern(_scope: LoopScopeShape) -> Option<JoinModule> {
|
||
|
|
// Phase 188: Lowering implementation
|
||
|
|
// This is a skeleton that will be filled in after examining LoopScopeShape structure
|
||
|
|
// and understanding how to extract loop header, body, latch, and exit information.
|
||
|
|
|
||
|
|
// TODO Phase 188-4:
|
||
|
|
// 1. Extract carrier variables from scope.carriers
|
||
|
|
// 2. Create JoinModule with 3 functions: main/entry, loop_step, k_exit
|
||
|
|
// 3. Generate exit condition check (negate loop condition)
|
||
|
|
// 4. Generate conditional Jump to k_exit
|
||
|
|
// 5. Generate loop body instructions
|
||
|
|
// 6. Generate tail Call to loop_step with updated carriers
|
||
|
|
// 7. Wire k_exit to return appropriate value
|
||
|
|
|
||
|
|
None // Placeholder
|
||
|
|
}
|
||
|
|
|
||
|
|
#[cfg(test)]
|
||
|
|
mod tests {
|
||
|
|
use super::*;
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_pattern_detection_placeholder() {
|
||
|
|
// Placeholder test - will be implemented with actual LoopScopeShape instances
|
||
|
|
// after understanding the structure better
|
||
|
|
}
|
||
|
|
}
|