Struct Program

Source
pub struct Program(pub Vec<Token>);
Expand description

Parsed program representation

The program is represented using Reverse Polish Notation, which is lends to easy iterative translation into CLIF as well as to simple optimizations.

Tuple Fields§

§0: Vec<Token>

Implementations§

Source§

impl Program

Source

pub fn new(tokens: Vec<Token>) -> Self

Constructs program directly from RPN

Source

pub fn parse_from_infix(expr: &str) -> Result<Self, JitError>

Parses an infix notation into RPN

Source

pub fn reorder_ops_deepen(&mut self)

Rewrites RPN into a deeper form that’s more optimizable

The optimizer isn’t able to optimize RPN like [.. 1 + 1 +]. This function will replace it with [.. 1 1 + +], which the optimizer will rewrite as [.. 2 +].

The resultant form has a deeper stack, meaning more variables need to be kept alive at the same time.

Source

pub fn reorder_ops_flatten(&mut self)

Rewrites RPN into a form that requires a lower stack

a * (b / c) will produce RPN a b c / *, which keeps up to 3 variables alive at once. This optimization will rewrite it into RPN a b * c /, which does the same work despite using less memory.

Notably the constant folding algorithm in this library will fail to optimize this form.

Source

pub fn fold_constants_step(&mut self, library: &Library) -> bool

Evaluate some constant expressions

Optimizes binary and unary operations:

  • replace [const0, const1, op] with [op(const0, const1)]
  • replace [const, op] with [op(const)]

Token::Noop is removed in the process. Only one pass over the code is made. Returns false if no further progress can be made.

Doesn’t support reordering of associative operations, so [var, const0, add, const1, add] is not replaced with [var, add(const0, const1), add] and so on.

Source

pub fn optimize(&mut self, library: &Library)

Rewrites RPN into a form most suitable for codegen

Performs constant folding and minimizes stack usage of the resultant RPN.

For details, see:

Trait Implementations§

Source§

impl Debug for Program

Source§

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

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

impl PartialEq for Program

Source§

fn eq(&self, other: &Program) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for Program

Source§

fn partial_cmp(&self, other: &Program) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for Program

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, 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, 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.