pub enum ControlNodeKind {
Block {
insts: EntityList<DataInst>,
},
Select {
kind: SelectionKind,
scrutinee: Value,
cases: SmallVec<[ControlRegion; 2]>,
},
Loop {
initial_inputs: SmallVec<[Value; 2]>,
body: ControlRegion,
repeat_condition: Value,
},
ExitInvocation {
kind: ExitInvocationKind,
inputs: SmallVec<[Value; 2]>,
},
}
Variants§
Block
Linear chain of DataInst
s, executing in sequence.
This is only an optimization over keeping DataInst
s in ControlRegion
linear chains directly, or even merging DataInst
with ControlNode
.
Fields
insts: EntityList<DataInst>
Select
Choose one ControlRegion
out of cases
to execute, based on a single
value input (scrutinee
) interpreted according to SelectionKind
.
This corresponds to “gamma” (γ
) nodes in (R)VSDG, though those are
sometimes limited only to a two-way selection on a boolean condition.
Loop
Execute body
repeatedly, until repeat_condition
evaluates to false
.
To represent “loop state”, body
can take inputs
, getting values from:
- on the first iteration:
initial_inputs
- on later iterations:
body
’s ownoutputs
(from the last iteration)
As the condition is checked only after the body, this type of loop is
sometimes described as “tail-controlled”, and is also equivalent to the
C-like do { body; } while(repeat_condition)
construct.
This corresponds to “theta” (θ
) nodes in (R)VSDG.
ExitInvocation
Leave the current invocation, similar to returning from every function call in the stack (up to and including the entry-point), but potentially indicating a fatal error as well.
Trait Implementations§
Source§impl Clone for ControlNodeKind
impl Clone for ControlNodeKind
Source§fn clone(&self) -> ControlNodeKind
fn clone(&self) -> ControlNodeKind
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl Freeze for ControlNodeKind
impl RefUnwindSafe for ControlNodeKind
impl Send for ControlNodeKind
impl Sync for ControlNodeKind
impl Unpin for ControlNodeKind
impl UnwindSafe for ControlNodeKind
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more