diff --git a/src/mir/builder/control_flow/joinir/mod.rs b/src/mir/builder/control_flow/joinir/mod.rs
new file mode 100644
index 00000000..7f64b44c
--- /dev/null
+++ b/src/mir/builder/control_flow/joinir/mod.rs
@@ -0,0 +1,7 @@
+//! JoinIR integration for control flow
+//!
+//! This module contains JoinIR-related control flow logic:
+//! - Pattern lowerers (patterns/)
+//! - Routing logic (future Phase 3)
+
+pub(in crate::mir::builder) mod patterns;
diff --git a/src/mir/builder/control_flow/joinir/patterns/mod.rs b/src/mir/builder/control_flow/joinir/patterns/mod.rs
new file mode 100644
index 00000000..c5b5bb5c
--- /dev/null
+++ b/src/mir/builder/control_flow/joinir/patterns/mod.rs
@@ -0,0 +1,10 @@
+//! Pattern lowerers for different loop constructs
+//!
+//! Phase 2: Extracted from control_flow.rs
+//! - Pattern 1: Simple While Loop (pattern1_minimal.rs)
+//! - Pattern 2: Loop with Conditional Break (pattern2_with_break.rs)
+//! - Pattern 3: Loop with If-Else PHI (pattern3_with_if_phi.rs)
+
+pub(in crate::mir::builder) mod pattern1_minimal;
+pub(in crate::mir::builder) mod pattern2_with_break;
+pub(in crate::mir::builder) mod pattern3_with_if_phi;
diff --git a/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs b/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs
new file mode 100644
index 00000000..7c1d994b
--- /dev/null
+++ b/src/mir/builder/control_flow/joinir/patterns/pattern1_minimal.rs
@@ -0,0 +1,156 @@
+//! Pattern 1: Simple While Loop minimal lowerer
+
+use crate::ast::ASTNode;
+use crate::mir::builder::MirBuilder;
+use crate::mir::ValueId;
+
+impl MirBuilder {
+ /// Phase 188-Impl-1-F: Pattern 1 (Simple While Loop) minimal lowerer
+ ///
+ /// This bypasses the LoopFrontendBinding JSON path and directly calls
+ /// the Pattern 1 minimal lowerer for apps/tests/loop_min_while.hako
+ ///
+ /// # Phase 188-Impl-2: Host Variable Integration
+ ///
+ /// Extracts the loop variable from the host function (e.g., `i` from `i < 3`)
+ /// and passes it to the Pattern 1 lowerer along with a ValueId allocator.
+ ///
+ /// # Pipeline
+ /// 1. Extract loop variable name from condition
+ /// 2. Look up ValueId in host variable_map
+ /// 3. Create Pattern1Context with host variable + allocator
+ /// 4. Call simple_while_minimal::lower_simple_while_minimal() → JoinModule
+ /// 5. convert_join_module_to_mir_with_meta() → MirModule
+ /// 6. Merge MIR blocks into current_function
+ pub(in crate::mir::builder) fn cf_loop_pattern1_minimal(
+ &mut self,
+ condition: &ASTNode,
+ _body: &[ASTNode],
+ _func_name: &str,
+ debug: bool,
+ ) -> Result