mir(builder/loops): add in_loop()/depth() helpers; clean up Break lowering comment (no behavior change)

This commit is contained in:
Selfhosting Dev
2025-09-17 07:50:15 +09:00
parent ee4224d7d2
commit e47ee65a40
2 changed files with 12 additions and 9 deletions

View File

@ -26,3 +26,13 @@ pub(crate) fn current_header(builder: &super::MirBuilder) -> Option<BasicBlockId
pub(crate) fn current_exit(builder: &super::MirBuilder) -> Option<BasicBlockId> { pub(crate) fn current_exit(builder: &super::MirBuilder) -> Option<BasicBlockId> {
builder.loop_exit_stack.last().copied() builder.loop_exit_stack.last().copied()
} }
/// Returns true if the builder is currently inside at least one loop context.
pub(crate) fn in_loop(builder: &super::MirBuilder) -> bool {
!builder.loop_header_stack.is_empty()
}
/// Current loop nesting depth (0 means not in a loop).
pub(crate) fn depth(builder: &super::MirBuilder) -> usize {
builder.loop_header_stack.len()
}

View File

@ -537,18 +537,11 @@ impl<'a> LoopBuilder<'a> {
ASTNode::Break { .. } => { ASTNode::Break { .. } => {
// Jump to loop exit (after_loop_id) if available // Jump to loop exit (after_loop_id) if available
let cur_block = self.current_block()?; let cur_block = self.current_block()?;
// Ensure parent has recorded current loop exit; if not, record now if let Some(exit_bb) = crate::mir::builder::loops::current_exit(self.parent_builder) {
if crate::mir::builder::loops::current_exit(self.parent_builder).is_none() {
// Determine after_loop by peeking the next id used earlier:
// In this builder, after_loop_id was created above; record it for nested lowering
// We approximate by using the next block id minus 1 (after_loop) which we set below before branch
}
if let Some(exit_bb) = crate::mir::builder::loops::current_exit(self.parent_builder)
{
self.emit_jump(exit_bb)?; self.emit_jump(exit_bb)?;
let _ = self.add_predecessor(exit_bb, cur_block); let _ = self.add_predecessor(exit_bb, cur_block);
} }
// Keep building in a fresh (unreachable) block to satisfy callers // Continue building in a fresh (unreachable) block to satisfy callers
let next_block = self.new_block(); let next_block = self.new_block();
self.set_current_block(next_block)?; self.set_current_block(next_block)?;
let void_id = self.new_value(); let void_id = self.new_value();