Remark: the insertResetReuse transformation is applied before we have
inserted inc/dec instructions, and performed lower level optimizations
that introduce the instructions release and set.
Remark: the functions S, D and R defined here implement the
corresponding functions in the paper "Counting Immutable Beans"
Here are the main differences:
- We use the State monad to manage the generation of fresh variable names.
- Support for join points, and usetandssetinstructions for unboxed data.
- Duses the auxiliary function- Dmain.
- Dmainreturns a pair- (b, found)to avoid quadratic behavior when checking the last occurrence of the variable- x.
- Because we have join points in the actual implementation, a variable may be live even if it
does not occur in a function body. See example at livevars.lean.
- lctx : LocalContext
- Contains all variables in - casesstatements in the current path and variables that are already in- resetstatements when we invoke- R.- We use this information to prevent double-reset in code such as - case x_i : obj of Prod.mk → case x_i : obj of Prod.mk → ...- A variable can already be in a - resetstatement when we invoke- Rbecause we execute it with and without- relaxedReuse.
- relaxedReuse : BoolIf relaxedReuse := true, then allow memory cells from different constructors to be reused. For example, we can reuse aPSigma.mkto allocate aProd.mk. To avoid counterintuitive behavior, we first tryrelaxedReuse := false, and thenrelaxedReuse := true.
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
- d.insertResetReuseCore relaxedReuse = d