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
impl Program
Sourcepub fn parse_from_infix(expr: &str) -> Result<Self, JitError>
pub fn parse_from_infix(expr: &str) -> Result<Self, JitError>
Parses an infix notation into RPN
Sourcepub fn reorder_ops_deepen(&mut self)
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.
Sourcepub fn reorder_ops_flatten(&mut self)
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.
Sourcepub fn fold_constants_step(&mut self, library: &Library) -> bool
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.