Skip to main content

CFGContext

Struct CFGContext 

Source
pub struct CFGContext {
    pub edges: HashMap<UOpKey, Arc<UOp>>,
}
Expand description

Control flow graph context for linearization.

Tracks ordering edges between sibling RANGE operations to ensure proper linearization order when loops are at the same nesting level.

Based on Tinygrad’s CFGContext which tracks three relationships between ranges:

  • nested: END y is a dependency of END x AND RANGE x is a dependency of END y
  • dependent: END y is a dependency of END x AND RANGE x is NOT a dependency of END y
  • independent: END y is NOT a dependency of END x

§Control Flow Edges

When multiple ENDs exist at the same nesting level (siblings), they need to be ordered consistently. CFGContext computes edges where:

  • Each RANGE points to its predecessor (either the parent’s RANGE or another END)
  • Edges ensure sequential execution of sibling loops

§Example

RANGE(i) → ... → END(i)   // first loop
RANGE(j) → ... → END(j)   // second loop (sibling)
RANGE(k) → ... → END(k)   // third loop (sibling)

CFGContext edges:
  RANGE(j) → END(i)    // j's RANGE depends on i's END
  RANGE(k) → END(j)    // k's RANGE depends on j's END

Fields§

§edges: HashMap<UOpKey, Arc<UOp>>

Maps RANGE → predecessor (previous sibling END or parent’s RANGE).

The predecessor is the operation that must complete before this RANGE can begin execution.

Implementations§

Source§

impl CFGContext

Source

pub fn new(sink: &Arc<UOp>) -> Self

Build a control flow context from a kernel AST.

Analyzes the graph to find sibling ENDs at the same nesting level and creates ordering edges between their RANGEs.

§Algorithm (from Tinygrad linearizer.py:59-91)
  1. Build transitive deps map (RANGE/END add themselves to deps)
  2. Build nesting map: which END/SINK nests each END
  3. Group siblings by parent
  4. Order siblings by dependency count (fewer deps = earlier)
  5. Create edges: RANGE of later sibling → predecessor (END or parent’s RANGE)
Source

pub fn get_predecessor(&self, range: &Arc<UOp>) -> Option<&Arc<UOp>>

Get the predecessor for a given RANGE operation.

Returns Some(predecessor) if this RANGE has a sibling that must execute before it, None if this is the first RANGE at its level.

Source

pub fn has_edges(&self) -> bool

Check if this context has any control flow edges.

Returns true if there are sibling RANGEs that require ordering.

Source

pub fn edge_count(&self) -> usize

Get the number of control flow edges.

Trait Implementations§

Source§

impl Debug for CFGContext

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CFGContext

Source§

fn default() -> CFGContext

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more