pub struct Block(pub Index);
Tuple Fields
0: Index
Implementations
sourceimpl Block
impl Block
sourcepub fn new(
context: &mut Context,
function: Function,
label: Option<String>
) -> Block
pub fn new(
context: &mut Context,
function: Function,
label: Option<String>
) -> Block
Return a new block handle.
Creates a new Block belonging to function
in the context and returns its handle. label
is optional and is used only when printing the IR.
sourcepub fn get_function(&self, context: &Context) -> Function
pub fn get_function(&self, context: &Context) -> Function
Get the parent function for this block.
sourcepub fn ins<'a>(&self, context: &'a mut Context) -> InstructionInserter<'a>
pub fn ins<'a>(&self, context: &'a mut Context) -> InstructionInserter<'a>
Create a new InstructionIterator
to more easily append instructions to this block.
sourcepub fn get_label(&self, context: &Context) -> String
pub fn get_label(&self, context: &Context) -> String
Get the label of this block. If it wasn’t given one upon creation it will be a generated label.
sourcepub fn num_instructions(&self, context: &Context) -> usize
pub fn num_instructions(&self, context: &Context) -> usize
Get the number of instructions in this block, NOT including the phi instruction.
sourcepub fn num_predecessors(&self, context: &Context) -> usize
pub fn num_predecessors(&self, context: &Context) -> usize
Get the number of predecessor blocks, i.e., blocks which branch to this one.
sourcepub fn add_phi(&self, context: &mut Context, from_block: Block, phi_value: Value)
pub fn add_phi(&self, context: &mut Context, from_block: Block, phi_value: Value)
Add a new phi entry to this block.
This indicates that if control flow comes from from_block
then the phi instruction should
use phi_value
.
sourcepub fn add_phis_from_iter(
&self,
context: &mut Context,
iter: impl Iterator<Item = (Block, Value)>
)
pub fn add_phis_from_iter(
&self,
context: &mut Context,
iter: impl Iterator<Item = (Block, Value)>
)
Add PHI entries to this block from the given iterator.
sourcepub fn phi_iter<'a>(
&'a self,
context: &'a Context
) -> impl Iterator<Item = &'_ (Block, Value)>
pub fn phi_iter<'a>(
&'a self,
context: &'a Context
) -> impl Iterator<Item = &'_ (Block, Value)>
Get an iterator over this block’s PHI pairs.
sourcepub fn get_phi_val_coming_from(
&self,
context: &Context,
from_block: &Block
) -> Option<Value>
pub fn get_phi_val_coming_from(
&self,
context: &Context,
from_block: &Block
) -> Option<Value>
Get the value from the phi instruction which correlates to from_block
.
Returns None
if from_block
isn’t found.
sourcepub fn remove_phi_val_coming_from(
&self,
context: &mut Context,
from_block: &Block
)
pub fn remove_phi_val_coming_from(
&self,
context: &mut Context,
from_block: &Block
)
Remove the value in the phi instruction which correlates to from_block
.
sourcepub fn update_phi_source_block(
&self,
context: &mut Context,
old_source: Block,
new_source: Block
)
pub fn update_phi_source_block(
&self,
context: &mut Context,
old_source: Block,
new_source: Block
)
Replace a block reference in the phi instruction.
Any reference to old_source
will be replace with new_source
in the list of phi values.
sourcepub fn get_terminator<'a>(&self, context: &'a Context) -> Option<&'a Instruction>
pub fn get_terminator<'a>(&self, context: &'a Context) -> Option<&'a Instruction>
Get a reference to the block terminator.
Returns None
if block is empty.
sourcepub fn get_terminator_mut<'a>(
&self,
context: &'a mut Context
) -> Option<&'a mut Instruction>
pub fn get_terminator_mut<'a>(
&self,
context: &'a mut Context
) -> Option<&'a mut Instruction>
Get a mut reference to the block terminator.
Returns None
if block is empty.
sourcepub fn is_terminated(&self, context: &Context) -> bool
pub fn is_terminated(&self, context: &Context) -> bool
Return whether this block is already terminated. Checks if the final instruction, if it exists, is a terminator.
sourcepub fn is_terminated_by_ret(&self, context: &Context) -> bool
pub fn is_terminated_by_ret(&self, context: &Context) -> bool
Return whether this block is already terminated specifically by a Ret instruction.
sourcepub fn replace_value(&self, context: &mut Context, old_val: Value, new_val: Value)
pub fn replace_value(&self, context: &mut Context, old_val: Value, new_val: Value)
Replace a value within this block.
For every instruction within the block, any reference to old_val
is replaced with
new_val
.
sourcepub fn remove_instruction(&self, context: &mut Context, instr_val: Value)
pub fn remove_instruction(&self, context: &mut Context, instr_val: Value)
Remove an instruction from this block.
NOTE: We must be very careful! We mustn’t remove the phi or the terminator. Some
extra checks should probably be performed here to avoid corruption! Ideally we use get a
user/uses system implemented. Using Vec::remove()
is also O(n) which we may want to
avoid someday.
sourcepub fn replace_instruction(
&self,
context: &mut Context,
old_instr_val: Value,
new_instr_val: Value
) -> Result<(), IrError>
pub fn replace_instruction(
&self,
context: &mut Context,
old_instr_val: Value,
new_instr_val: Value
) -> Result<(), IrError>
Replace an instruction in this block with another. Will return a ValueNotFound on error. Any use of the old instruction value will also be replaced by the new value throughout the owning function.
sourcepub fn split_at(&self, context: &mut Context, split_idx: usize) -> (Block, Block)
pub fn split_at(&self, context: &mut Context, split_idx: usize) -> (Block, Block)
Split the block into two.
This will create a new block and move the instructions at and following split_idx
to it.
Returns both blocks.
sourcepub fn instruction_iter(&self, context: &Context) -> InstructionIteratorⓘNotable traits for InstructionIteratorimpl Iterator for InstructionIterator type Item = Value;
pub fn instruction_iter(&self, context: &Context) -> InstructionIteratorⓘNotable traits for InstructionIteratorimpl Iterator for InstructionIterator type Item = Value;
Return an instruction iterator for each instruction in this block.