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>
141 lines
5.5 KiB
Rust
141 lines
5.5 KiB
Rust
use crate::mir::optimizer::MirOptimizer;
|
||
use crate::mir::optimizer_stats::OptimizationStats;
|
||
use crate::mir::{BasicBlockId, MirInstruction, MirModule, ValueId};
|
||
|
||
/// Diagnostic: detect unlowered is/as/isType/asType after Builder
|
||
pub fn diagnose_unlowered_type_ops(
|
||
opt: &mut MirOptimizer,
|
||
module: &MirModule,
|
||
) -> OptimizationStats {
|
||
let mut stats = OptimizationStats::new();
|
||
let diag_on = opt.debug_enabled() || crate::config::env::opt_diag();
|
||
for (fname, function) in &module.functions {
|
||
let mut def_map: std::collections::HashMap<ValueId, (BasicBlockId, usize)> =
|
||
std::collections::HashMap::new();
|
||
for (bb_id, block) in &function.blocks {
|
||
for (i, inst) in block.instructions.iter().enumerate() {
|
||
if let Some(dst) = inst.dst_value() {
|
||
def_map.insert(dst, (*bb_id, i));
|
||
}
|
||
}
|
||
if let Some(term) = &block.terminator {
|
||
if let Some(dst) = term.dst_value() {
|
||
def_map.insert(dst, (*bb_id, usize::MAX));
|
||
}
|
||
}
|
||
}
|
||
let mut count = 0usize;
|
||
for (_bb, block) in &function.blocks {
|
||
for inst in &block.instructions {
|
||
match inst {
|
||
MirInstruction::BoxCall { method, .. }
|
||
if method == "is"
|
||
|| method == "as"
|
||
|| method == "isType"
|
||
|| method == "asType" =>
|
||
{
|
||
count += 1;
|
||
}
|
||
MirInstruction::Call { func, .. } => {
|
||
if let Some((bb, idx)) = def_map.get(func).copied() {
|
||
if let Some(b) = function.blocks.get(&bb) {
|
||
if idx < b.instructions.len() {
|
||
if let MirInstruction::Const {
|
||
value: crate::mir::ConstValue::String(s),
|
||
..
|
||
} = &b.instructions[idx]
|
||
{
|
||
if s == "isType" || s == "asType" {
|
||
count += 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
_ => {}
|
||
}
|
||
}
|
||
}
|
||
if count > 0 {
|
||
stats.diagnostics_reported += count;
|
||
if diag_on {
|
||
eprintln!(
|
||
"[OPT][DIAG] Function '{}' has {} unlowered type-op calls",
|
||
fname, count
|
||
);
|
||
}
|
||
}
|
||
}
|
||
stats
|
||
}
|
||
|
||
/// Diagnostic: detect legacy instructions that should be unified
|
||
/// Legacy set: TypeCheck/Cast/WeakNew/WeakLoad/BarrierRead/BarrierWrite/ArrayGet/ArraySet/RefGet/RefSet/PluginInvoke
|
||
pub fn diagnose_legacy_instructions(
|
||
opt: &mut MirOptimizer,
|
||
module: &MirModule,
|
||
) -> OptimizationStats {
|
||
let mut stats = OptimizationStats::new();
|
||
let diag_on = opt.debug_enabled()
|
||
|| crate::config::env::opt_diag()
|
||
|| crate::config::env::opt_diag_forbid_legacy();
|
||
for (fname, function) in &module.functions {
|
||
let mut count = 0usize;
|
||
for (_bb, block) in &function.blocks {
|
||
for inst in &block.instructions {
|
||
match inst {
|
||
MirInstruction::TypeCheck { .. }
|
||
| MirInstruction::Cast { .. }
|
||
| MirInstruction::WeakNew { .. }
|
||
| MirInstruction::WeakLoad { .. }
|
||
| MirInstruction::BarrierRead { .. }
|
||
| MirInstruction::BarrierWrite { .. }
|
||
| MirInstruction::ArrayGet { .. }
|
||
| MirInstruction::ArraySet { .. }
|
||
| MirInstruction::RefGet { .. }
|
||
| MirInstruction::RefSet { .. }
|
||
| MirInstruction::PluginInvoke { .. } => {
|
||
count += 1;
|
||
}
|
||
_ => {}
|
||
}
|
||
}
|
||
if let Some(term) = &block.terminator {
|
||
match term {
|
||
MirInstruction::TypeCheck { .. }
|
||
| MirInstruction::Cast { .. }
|
||
| MirInstruction::WeakNew { .. }
|
||
| MirInstruction::WeakLoad { .. }
|
||
| MirInstruction::BarrierRead { .. }
|
||
| MirInstruction::BarrierWrite { .. }
|
||
| MirInstruction::ArrayGet { .. }
|
||
| MirInstruction::ArraySet { .. }
|
||
| MirInstruction::RefGet { .. }
|
||
| MirInstruction::RefSet { .. }
|
||
| MirInstruction::PluginInvoke { .. } => {
|
||
count += 1;
|
||
}
|
||
_ => {}
|
||
}
|
||
}
|
||
}
|
||
if count > 0 {
|
||
stats.diagnostics_reported += count;
|
||
if diag_on {
|
||
eprintln!(
|
||
"[OPT][DIAG] Function '{}' has {} legacy MIR ops: unify to Core‑13 (TypeOp/WeakRef/Barrier/BoxCall)",
|
||
fname, count
|
||
);
|
||
if crate::config::env::opt_diag_forbid_legacy() {
|
||
panic!(
|
||
"NYASH_OPT_DIAG_FORBID_LEGACY=1: legacy MIR ops detected in '{}': {}",
|
||
fname, count
|
||
);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
stats
|
||
}
|