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:
@ -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())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user