builder: add loop helpers (create_loop_blocks/add_predecessor) and adopt in LoopBuilder; use BinaryExpr/CallExpr wrappers in expr lowering (no behavior change)

This commit is contained in:
Selfhosting Dev
2025-09-17 07:59:41 +09:00
parent f3be8ea5f6
commit 6b505b5435
3 changed files with 44 additions and 26 deletions

View File

@ -1,5 +1,14 @@
//! Small loop utilities for MirBuilder
use super::BasicBlockId;
use super::{BasicBlockId, MirBuilder};
/// Create header/body/after blocks for a loop and push loop context.
pub(crate) fn create_loop_blocks(builder: &mut MirBuilder) -> (BasicBlockId, BasicBlockId, BasicBlockId) {
let header = builder.block_gen.next();
let body = builder.block_gen.next();
let after = builder.block_gen.next();
push_loop_context(builder, header, after);
(header, body, after)
}
/// Push loop context (header/exit) onto the MirBuilder stacks.
pub(crate) fn push_loop_context(
@ -36,3 +45,19 @@ pub(crate) fn in_loop(builder: &super::MirBuilder) -> bool {
pub(crate) fn depth(builder: &super::MirBuilder) -> usize {
builder.loop_header_stack.len()
}
/// Add predecessor edge metadata to a basic block.
pub(crate) fn add_predecessor(
builder: &mut MirBuilder,
block: BasicBlockId,
pred: BasicBlockId,
) -> Result<(), String> {
if let Some(ref mut function) = builder.current_function {
if let Some(bb) = function.get_block_mut(block) {
bb.add_predecessor(pred);
return Ok(());
}
return Err(format!("Block {} not found", block));
}
Err("No current function".to_string())
}