docs(phi-reduction): Add Phase 40/41+ deletion markers to if_phi.rs/conservative.rs

Phase 35-39整理(B): ソースコード責務マーキング
- if_phi.rs: Module-level Phase 35-41+ deletion plan added
- if_phi.rs: Function-level markers for Level 2/3 targets
- conservative.rs: Phase 40/41+ deletion plan added

Markers include:
- Deletion phase (40-1/40-2/40-3/40-4, 41+)
- Deletion conditions (prerequisites)
- Replacement path (JoinIR Frontend, JoinIR Verifier)
- Callsites (file:line)
- Reduction effect (line counts)

Effect: Deletion plan visible in code for developers and AI agents

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-28 07:30:01 +09:00
parent 9e97e114eb
commit 231eb6e138
2 changed files with 194 additions and 0 deletions

View File

@ -7,12 +7,44 @@
//! Phase 25.1q: Conservative PHI戦略の一元化
//! - phi.rs の Conservative PHI ロジックL23-117を統一
//! - void emission、predecessor fallback の一貫性保証
//!
//! # Phase 35-39 PHI削減計画
//!
//! ## 概要
//!
//! Conservative ∘ Elimination = Minimal SSA の理論に基づく保守的PHI生成。
//! 非対称分岐else なし)での void emission と predecessor fallback を扱う。
//!
//! ## 🔜 Phase 40で部分削除予定Level 2、30行
//!
//! - ConservativeMerge struct inline (30行)
//! - **Phase 40-4**: JoinIrConservativeAnalyzerに吸収
//! - **保持**: 理論コメント、Conservative ∘ Elimination説明
//! - **削除**: 構造体定義、実装コード
//!
//! ## ⏳ Phase 41+で完全削除予定Level 3、約138行
//!
//! - 残りのconservative logic全て
//! - **削除条件**: JoinIR Verifier完全移行
//! - **難易度**: MEDIUM-HIGH
//!
//! ## 参照
//!
//! - Phase 37分析: `docs/.../phase-37-if-phi-reduction/conservative_responsibility_table.md`
//! - Phase 39設計: `docs/.../phase-39-if-phi-level2/joinir_extension_design.md`
use crate::mir::ValueId;
use std::collections::{BTreeMap, HashSet}; // Phase 25.1: BTreeMap化
/// Conservative PHI 戦略による変数マージ分析
///
/// # Phase 40削減計画
///
/// - **Phase 40-4**: JoinIrConservativeAnalyzerにインライン化
/// - **削減効果**: 30行構造体定義実装
/// - **保持**: Conservative ∘ Elimination理論コメント
pub struct ConservativeMerge {
// TODO(Phase 40-4): JoinIrConservativeAnalyzerに移行予定
/// 全ブランチに存在する変数のユニオンConservative戦略
pub all_vars: HashSet<String>,
/// 実際に変更された変数のセット(デバッグ/ヒント用)
@ -26,11 +58,15 @@ impl ConservativeMerge {
/// * `pre_if` - if文前のスナップショット
/// * `then_end` - then-branch終了時の変数マップ
/// * `else_end_opt` - else-branch終了時の変数マップNoneの場合はempty else
///
/// # Phase 40-2で使用されるcompute_modified_names削除時
pub fn analyze(
pre_if: &BTreeMap<String, ValueId>, // Phase 25.1: BTreeMap化
then_end: &BTreeMap<String, ValueId>, // Phase 25.1: BTreeMap化
else_end_opt: &Option<BTreeMap<String, ValueId>>, // Phase 25.1: BTreeMap化
) -> Self {
// TODO(Phase 40-2/40-4): JoinIR Verifierに移行
let mut all_vars = HashSet::new();
all_vars.extend(pre_if.keys().cloned());
all_vars.extend(then_end.keys().cloned());

View File

@ -4,6 +4,60 @@
* Public thin wrappers that mirror the semantics of existing builder::phi
* helpers. Implemented locally to avoid depending on private submodules.
* Behavior is identical to the current in-tree logic.
*
* # Phase 35-39 PHI削減計画
*
* このファイルは段階的に縮退・削除される。各関数のPhase別削除計画を以下に示す。
*
* ## ✅ Phase 38で削除済みLevel 1、90行
*
* - `merge_modified_with_control` (51行, dead code, 呼び出し0)
* - `extract_assigned_var` (39行, JoinIR AST lowering replacement)
*
* **if_phi.rs**: 315行 → 225行28.6%削減達成)
*
* ## 🔜 Phase 40で削除予定Level 2、115行
*
* - `collect_assigned_vars` (32行)
* - **削除条件**: array_ext.filter実装完了if-in-loop AST lowering
* - **置換**: JoinIR Frontend `extract_if_in_loop_modified_vars()`
* - **callsites**: loop_builder.rs:1069, 1075
* - **Phase**: Phase 40-1
*
* - `compute_modified_names` (26行)
* - **削除条件**: JoinIR Verifier conservative migration完了
* - **置換**: `JoinIrConservativeAnalyzer`
* - **callsites**: conservative.rs:42
* - **Phase**: Phase 40-2
*
* - `merge_with_reset_at_merge_with` (27行)
* - **削除条件**: Full IfMerge with reset semantics実装
* - **置換**: IfMerge reset extension
* - **Phase**: Phase 40-3
*
* - conservative.rs struct inline (30行)
* - **Phase**: Phase 40-4
*
* **予想**: if_phi.rs: 225行 → 110行51%削減)
*
* ## ⏳ Phase 41+で削除予定Level 3、約300行
*
* - `merge_modified_at_merge_with` (63行, コアPHI生成ロジック)
* - **削除条件**: Stage-1/Stage-B/selfhost完全JoinIRカバレッジ
* - **難易度**: HIGH
* - **依存**: 全If/Loop統合、PhiMergeOps trait置換
*
* - その他複雑PHI生成関数約237行
* - **削除条件**: Level 3基準達成JoinIR 92%カバレッジ)
*
* **予想**: if_phi.rs: 110行 → ほぼ削除 or 最小ユーティリティのみ
*
* ## 参照ドキュメント
*
* - 全体計画: `docs/private/roadmap2/phases/phi-reduction-series/INDEX.md`
* - Phase 37設計: `docs/private/roadmap2/phases/phase-37-if-phi-reduction/`
* - Phase 39詳細: `docs/private/roadmap2/phases/phase-39-if-phi-level2/`
* - Phase 40ロードマップ: `docs/.../phase-39-if-phi-level2/deletion_sequence_detailed.md`
*/
use crate::ast::ASTNode;
@ -35,9 +89,45 @@ pub fn infer_type_from_phi(
}
// ========================================
// Phase 40削除予定Level 2
// ========================================
/// ループ内if文の代入変数収集
///
/// Collect all variable names that are assigned within the given AST subtree.
/// Useful for computing PHI merge candidates across branches/blocks.
///
/// # Phase 40削減計画
///
/// - **削除予定**: Phase 40-1array_ext.filter実装後
/// - **置換先**: JoinIR Frontend `extract_if_in_loop_modified_vars()`
/// - **削除条件**:
/// - ✅ array_ext.filter via JoinIR Frontend実装完了
/// - ✅ A/Bテスト旧PHIパス vs JoinIRパスPASS
/// - ✅ この関数の全callsiteでJoinIR置換確認
/// - **callsites**: 2箇所
/// - loop_builder.rs:1069 (if-in-loop pattern)
/// - loop_builder.rs:1075 (if-in-loop pattern)
/// - **削減効果**: 32行
///
/// # Migration Path
///
/// ```rust,ignore
/// // Before (Phase 38以前)
/// let vars = if_phi::collect_assigned_vars(loop_body, var_map);
///
/// // After (Phase 40)
/// // JoinIR Frontend AST loweringで自動収集
/// // ast_lowerer.extract_if_in_loop_modified_vars()が代替
/// ```
///
/// # See Also
/// - Design: `docs/.../phase-39-if-phi-level2/joinir_extension_design.md`
/// - Replacement: `src/mir/join_ir/frontend/ast_lowerer.rs::extract_if_in_loop_modified_vars()`
pub fn collect_assigned_vars(ast: &ASTNode, out: &mut std::collections::BTreeSet<String>) {
// TODO(Phase 40-1): この関数は削除予定
// JoinIR Frontend if-in-loop AST loweringに置き換え
match ast {
ASTNode::Assignment { target, .. } => {
if let ASTNode::Variable { name, .. } = target.as_ref() {
@ -71,13 +161,45 @@ pub fn collect_assigned_vars(ast: &ASTNode, out: &mut std::collections::BTreeSet
}
}
/// 保守的修正名前計算
///
/// Compute the set of variable names whose values changed in either branch
/// relative to the pre-if snapshot.
///
/// # Purpose
/// Conservative PHI生成戦略で修正される変数名を計算。
/// 非対称分岐else なしでのvoid emission用。
///
/// # Phase 40削減計画
///
/// - **削除予定**: Phase 40-2JoinIR Verifier conservative migration後
/// - **置換先**: `JoinIrConservativeAnalyzer`
/// - **削除条件**:
/// - ✅ ConservativeMerge logic → JoinIR Verifier migration完了
/// - ✅ Conservative value propagation in JoinIR実装
/// - **callsites**: 1箇所
/// - conservative.rs:42 (ConservativeMerge::analyze)
/// - **削減効果**: 26行
///
/// # Migration Path
///
/// ```rust,ignore
/// // Before
/// let modified = if_phi::compute_modified_names(if_expr);
///
/// // After (Phase 40)
/// // JoinIR Verifier内でconservative分析
/// let analyzer = JoinIrConservativeAnalyzer::new();
/// let modified = analyzer.compute_modified_names(join_ir_func);
/// ```
pub fn compute_modified_names(
pre_if_snapshot: &BTreeMap<String, ValueId>,
then_map_end: &BTreeMap<String, ValueId>,
else_map_end_opt: &Option<BTreeMap<String, ValueId>>,
) -> Vec<String> {
// TODO(Phase 40-2): JoinIR Verifierに移行予定
// JoinIrConservativeAnalyzerに置き換え
use std::collections::BTreeSet;
// 決定的順序のためBTreeSet使用
let mut names: BTreeSet<&str> = BTreeSet::new();
@ -122,8 +244,31 @@ pub trait PhiMergeOps {
}
}
// ========================================
// Phase 41+削除予定Level 3、HIGH難易度
// ========================================
/// 複雑PHI生成コアロジック
///
/// Merge variables modified in branches at the merge block using provided ops.
/// Handles both two-pred and single-pred (reachable) cases gracefully.
///
/// # Purpose
/// If/Loop統合時の複雑なPHI生成。PhiMergeOps traitのコア実装。
///
/// # Phase 41+削減計画
///
/// - **削除予定**: Phase 41+Stage-1/Stage-B/selfhost完全カバレッジ後
/// - **難易度**: HIGH
/// - **削除条件**:
/// - ❌ JoinIR Frontend 92%カバレッジ達成
/// - ❌ PhiMergeOps trait完全置換
/// - ❌ Stage-1/Stage-B/selfhost大半のIf/Loop動作
/// - **削減効果**: 63行
///
/// # Migration Path
///
/// Phase 41+でJoinIR Frontend完全実装後に設計予定。
pub fn merge_modified_at_merge_with<O: PhiMergeOps>(
ops: &mut O,
merge_bb: crate::mir::BasicBlockId,
@ -136,6 +281,9 @@ pub fn merge_modified_at_merge_with<O: PhiMergeOps>(
else_map_end_opt: &Option<BTreeMap<String, ValueId>>,
skip_var: Option<&str>,
) -> Result<(), String> {
// TODO(Phase 41+): Stage-1/Stage-B完全実装が前提
// JoinIR Frontend完全カバレッジ後に削除
let trace = std::env::var("NYASH_IF_TRACE").ok().as_deref() == Some("1");
let changed = compute_modified_names(pre_if_snapshot, then_map_end, else_map_end_opt);
for name in changed {
@ -192,9 +340,17 @@ pub fn merge_modified_at_merge_with<O: PhiMergeOps>(
Ok(())
}
/// PHI生成reset semantics付き
///
/// Convenience wrapper: reset variable map (via a caller-provided closure)
/// then perform merge at the merge block. Keeps caller simple while
/// avoiding tying phi_core to concrete builder internals.
///
/// # Phase 40削減計画
///
/// - **削除予定**: Phase 40-3Full IfMerge with reset実装後
/// - **置換先**: IfMerge reset extension
/// - **削減効果**: 27行
pub fn merge_with_reset_at_merge_with<O: PhiMergeOps>(
ops: &mut O,
merge_bb: crate::mir::BasicBlockId,
@ -208,6 +364,8 @@ pub fn merge_with_reset_at_merge_with<O: PhiMergeOps>(
reset_vars: impl FnOnce(),
skip_var: Option<&str>,
) -> Result<(), String> {
// TODO(Phase 40-3): IfMerge reset semantics拡張で置き換え
reset_vars();
merge_modified_at_merge_with(
ops,