refactor(joinir): Phase 222.5-E - Merge/Boundary HashMap → BTreeMap

Convert 10 medium-priority locations to BTreeMap for determinism:

Merge System (6 locations):
- instruction_rewriter.rs: value_to_func_name, function_params,
  function_entry_map, local_block_map
- value_collector.rs: value_to_func_name, function_params,
  function_entry_map

ID Remapper (2 locations):
- joinir_id_remapper.rs: block_map, value_map

Boundary Injector (2 locations):
- joinir_inline_boundary_injector.rs: value_map (param & return)

Impact:
- Changed files: 4
- Changed lines: +36, -24 (net +12)
- Tests: 849/856 PASS (no regression)
- Determinism: Merge/Boundary processing now deterministic

Combined with Phase 222.5-D (13 high-priority locations),
JoinIR pipeline now uses BTreeMap uniformly across all
critical paths (Pattern/Merge/Boundary/ValueId allocation).

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-10 14:09:18 +09:00
parent 948cc68889
commit 9dbf053781
4 changed files with 36 additions and 24 deletions

View File

@ -13,7 +13,7 @@ use crate::mir::join_ir::lowering::inline_boundary::JoinInlineBoundary;
use super::loop_header_phi_info::LoopHeaderPhiInfo;
use super::tail_call_classifier::{TailCallKind, classify_tail_call};
use super::merge_result::MergeResult;
use std::collections::HashMap;
use std::collections::BTreeMap; // Phase 222.5-E: HashMap → BTreeMap for determinism
/// Phase 179-A: Exit continuation function name (MIR convention)
/// This is the standard name for k_exit continuations in JoinIR → MIR lowering
@ -44,8 +44,8 @@ pub(super) fn merge_and_rewrite(
builder: &mut crate::mir::builder::MirBuilder,
mir_module: &MirModule,
remapper: &mut JoinIrIdRemapper,
value_to_func_name: &HashMap<ValueId, String>,
function_params: &HashMap<String, Vec<ValueId>>,
value_to_func_name: &BTreeMap<ValueId, String>, // Phase 222.5-E: HashMap → BTreeMap for determinism
function_params: &BTreeMap<String, Vec<ValueId>>, // Phase 222.5-E: HashMap → BTreeMap for determinism
boundary: Option<&JoinInlineBoundary>,
loop_header_phi_info: &mut LoopHeaderPhiInfo,
exit_block_id: BasicBlockId,
@ -68,7 +68,8 @@ pub(super) fn merge_and_rewrite(
std::collections::BTreeMap::new();
// Build function_entry_map for Call→Jump conversion
let mut function_entry_map: HashMap<String, BasicBlockId> = HashMap::new();
// Phase 222.5-E: HashMap → BTreeMap for determinism
let mut function_entry_map: BTreeMap<String, BasicBlockId> = BTreeMap::new();
for (func_name, func) in &mir_module.functions {
let entry_block_new = remapper
.get_block(func_name, func.entry_block)
@ -121,7 +122,8 @@ pub(super) fn merge_and_rewrite(
}
// Build a local block map for this function (for remap_instruction compatibility)
let mut local_block_map: HashMap<BasicBlockId, BasicBlockId> = HashMap::new();
// Phase 222.5-E: HashMap → BTreeMap for determinism
let mut local_block_map: BTreeMap<BasicBlockId, BasicBlockId> = BTreeMap::new();
for old_block_id in func.blocks.keys() {
let new_block_id = remapper
.get_block(func_name, *old_block_id)
@ -687,8 +689,9 @@ pub(super) fn merge_and_rewrite(
.get_block(entry_func_name, entry_func.entry_block)
.ok_or_else(|| format!("Entry block not found for {}", entry_func_name))?;
// Create HashMap from remapper for BoundaryInjector (temporary adapter)
let mut value_map_for_injector = HashMap::new();
// Create BTreeMap from remapper for BoundaryInjector (temporary adapter)
// Phase 222.5-E: HashMap → BTreeMap for determinism
let mut value_map_for_injector = BTreeMap::new();
// Phase 171-fix: Add join_inputs to value_map
for join_in in &boundary.join_inputs {

View File

@ -7,7 +7,8 @@
use crate::mir::{MirInstruction, MirModule, ValueId};
use crate::mir::builder::joinir_id_remapper::JoinIrIdRemapper;
use std::collections::{BTreeSet, HashMap};
use std::collections::BTreeSet; // Phase 222.5-E: HashMap → BTreeMap for determinism
use std::collections::BTreeMap; // Phase 222.5-E: HashMap → BTreeMap for determinism
/// Phase 2: Collect all ValueIds used across ALL functions (Phase 189)
///
@ -21,8 +22,8 @@ pub(super) fn collect_values(
) -> Result<
(
BTreeSet<ValueId>,
HashMap<ValueId, String>,
HashMap<String, Vec<ValueId>>,
BTreeMap<ValueId, String>, // Phase 222.5-E: HashMap → BTreeMap for determinism
BTreeMap<String, Vec<ValueId>>, // Phase 222.5-E: HashMap → BTreeMap for determinism
),
String,
> {
@ -33,11 +34,13 @@ pub(super) fn collect_values(
}
let mut used_values: BTreeSet<ValueId> = BTreeSet::new();
let mut value_to_func_name: HashMap<ValueId, String> = HashMap::new();
let mut function_params: HashMap<String, Vec<ValueId>> = HashMap::new();
// Phase 222.5-E: HashMap → BTreeMap for determinism
let mut value_to_func_name: BTreeMap<ValueId, String> = BTreeMap::new();
let mut function_params: BTreeMap<String, Vec<ValueId>> = BTreeMap::new();
// Build function_entry_map for tracking function names
let function_entry_map: HashMap<String, ()> = mir_module
// Phase 222.5-E: HashMap → BTreeMap for determinism
let function_entry_map: BTreeMap<String, ()> = mir_module
.functions
.keys()
.map(|name| (name.clone(), ()))