chore: Phase 25.1 完了 - LoopForm v2/Stage1 CLI/環境変数削減 + Phase 26-D からの変更
Phase 25.1 完了成果: - ✅ LoopForm v2 テスト・ドキュメント・コメント完備 - 4ケース(A/B/C/D)完全テストカバレッジ - 最小再現ケース作成(SSAバグ調査用) - SSOT文書作成(loopform_ssot.md) - 全ソースに [LoopForm] コメントタグ追加 - ✅ Stage-1 CLI デバッグ環境構築 - stage1_cli.hako 実装 - stage1_bridge.rs ブリッジ実装 - デバッグツール作成(stage1_debug.sh/stage1_minimal.sh) - アーキテクチャ改善提案文書 - ✅ 環境変数削減計画策定 - 25変数の完全調査・分類 - 6段階削減ロードマップ(25→5、80%削減) - 即時削除可能変数特定(NYASH_CONFIG/NYASH_DEBUG) Phase 26-D からの累積変更: - PHI実装改善(ExitPhiBuilder/HeaderPhiBuilder等) - MIRビルダーリファクタリング - 型伝播・最適化パス改善 - その他約300ファイルの累積変更 🎯 技術的成果: - SSAバグ根本原因特定(条件分岐内loop変数変更) - Region+next_iパターン適用完了(UsingCollectorBox等) - LoopFormパターン文書化・テスト化完了 - セルフホスティング基盤強化 Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com> Co-Authored-By: Task Assistant <task@anthropic.com>
This commit is contained in:
@ -8,11 +8,17 @@ pub struct BlockScheduleBox;
|
||||
impl BlockScheduleBox {
|
||||
/// Insert a Copy immediately after PHI nodes. Returns the local value id.
|
||||
#[allow(dead_code)]
|
||||
pub fn ensure_after_phis_copy(builder: &mut MirBuilder, src: ValueId) -> Result<ValueId, String> {
|
||||
pub fn ensure_after_phis_copy(
|
||||
builder: &mut MirBuilder,
|
||||
src: ValueId,
|
||||
) -> Result<ValueId, String> {
|
||||
if let Some(bb) = builder.current_block {
|
||||
if let Some(&cached) = builder.schedule_mat_map.get(&(bb, src)) {
|
||||
if std::env::var("NYASH_SCHEDULE_TRACE").ok().as_deref() == Some("1") {
|
||||
eprintln!("[schedule/after-phis] bb={:?} src=%{} cached dst=%{}", bb, src.0, cached.0);
|
||||
eprintln!(
|
||||
"[schedule/after-phis] bb={:?} src=%{} cached dst=%{}",
|
||||
bb, src.0, cached.0
|
||||
);
|
||||
}
|
||||
return Ok(cached);
|
||||
}
|
||||
@ -31,13 +37,18 @@ impl BlockScheduleBox {
|
||||
/// Emit a Copy right before the next emitted instruction (best-effort):
|
||||
/// place it at the tail of the current block. Returns the local value id.
|
||||
#[allow(dead_code)]
|
||||
pub fn emit_before_call_copy(builder: &mut MirBuilder, src: ValueId) -> Result<ValueId, String> {
|
||||
pub fn emit_before_call_copy(
|
||||
builder: &mut MirBuilder,
|
||||
src: ValueId,
|
||||
) -> Result<ValueId, String> {
|
||||
// Prefer to reuse the after-phis materialized id for this src in this block
|
||||
let base = Self::ensure_after_phis_copy(builder, src)?;
|
||||
let dst = builder.next_value_id();
|
||||
if std::env::var("NYASH_SCHEDULE_TRACE").ok().as_deref() == Some("1") {
|
||||
eprintln!("[schedule/before-call] bb={:?} src=%{} base=%{} dst=%{} (emitting Copy)",
|
||||
builder.current_block, src.0, base.0, dst.0);
|
||||
eprintln!(
|
||||
"[schedule/before-call] bb={:?} src=%{} base=%{} dst=%{} (emitting Copy)",
|
||||
builder.current_block, src.0, base.0, dst.0
|
||||
);
|
||||
}
|
||||
builder.emit_instruction(MirInstruction::Copy { dst, src: base })?;
|
||||
// Propagate metadata to keep dst consistent with base
|
||||
@ -54,8 +65,12 @@ impl BlockScheduleBox {
|
||||
return;
|
||||
}
|
||||
let (f_opt, bb_opt) = (builder.current_function.as_ref(), builder.current_block);
|
||||
let (Some(fun), Some(bb_id)) = (f_opt, bb_opt) else { return; };
|
||||
let Some(bb) = fun.get_block(bb_id) else { return; };
|
||||
let (Some(fun), Some(bb_id)) = (f_opt, bb_opt) else {
|
||||
return;
|
||||
};
|
||||
let Some(bb) = fun.get_block(bb_id) else {
|
||||
return;
|
||||
};
|
||||
|
||||
// 1) PHI group must be at head
|
||||
let mut seen_non_phi = false;
|
||||
@ -66,27 +81,27 @@ impl BlockScheduleBox {
|
||||
eprintln!("[block-schedule][verify] WARN: PHI found after non-PHI at bb={:?} idx={}", bb_id, idx);
|
||||
}
|
||||
}
|
||||
_ => { seen_non_phi = true; }
|
||||
_ => {
|
||||
seen_non_phi = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2) If a Copy is immediately before a Call-like, prefer it to be derived from after-PHIs copy
|
||||
let is_call_like = |mi: &MirInstruction| -> bool {
|
||||
matches!(mi,
|
||||
MirInstruction::Call { .. } |
|
||||
MirInstruction::BoxCall { .. } |
|
||||
MirInstruction::PluginInvoke { .. } |
|
||||
MirInstruction::ExternCall { .. }
|
||||
matches!(
|
||||
mi,
|
||||
MirInstruction::Call { .. }
|
||||
| MirInstruction::BoxCall { .. }
|
||||
| MirInstruction::PluginInvoke { .. }
|
||||
| MirInstruction::ExternCall { .. }
|
||||
)
|
||||
};
|
||||
for w in bb.instructions.windows(2) {
|
||||
if let [MirInstruction::Copy { dst: _, src }, call] = w {
|
||||
if is_call_like(call) {
|
||||
// best-effort: src should be one of the after-PHIs materialized ids for this bb
|
||||
let derived_ok = builder
|
||||
.schedule_mat_map
|
||||
.values()
|
||||
.any(|&v| v == *src);
|
||||
let derived_ok = builder.schedule_mat_map.values().any(|&v| v == *src);
|
||||
if !derived_ok {
|
||||
eprintln!(
|
||||
"[block-schedule][verify] WARN: tail Copy src=%{} is not from after-PHIs in bb={:?}",
|
||||
|
||||
@ -1,2 +1 @@
|
||||
pub mod block;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user