mir(builder/loops): add in_loop()/depth() helpers; clean up Break lowering comment (no behavior change)
This commit is contained in:
@ -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()
|
||||||
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user