Implements (extended) λPure and λRc proposed in the article "Counting Immutable Beans", Sebastian Ullrich and Leonardo de Moura.
The Lean to IR transformation produces λPure code, and this part is implemented in C++. The procedures described in the paper above are implemented in Lean.
Function identifier
Equations
Instances For
Equations
- Lean.IR.instInhabitedVarId = { default := { idx := default } }
Equations
- Lean.IR.instInhabitedJoinPointId = { default := { idx := default } }
Instances For
Equations
- Lean.IR.instBEqVarId = { beq := fun (a b : Lean.IR.VarId) => a.idx == b.idx }
Equations
- Lean.IR.instToStringVarId = { toString := fun (a : Lean.IR.VarId) => "x_" ++ toString a.idx }
Equations
- Lean.IR.instToFormatVarId = { format := fun (a : Lean.IR.VarId) => Std.Format.text (toString a) }
Equations
- Lean.IR.instHashableVarId = { hash := fun (a : Lean.IR.VarId) => hash a.idx }
Equations
- Lean.IR.instBEqJoinPointId = { beq := fun (a b : Lean.IR.JoinPointId) => a.idx == b.idx }
Equations
- Lean.IR.instToStringJoinPointId = { toString := fun (a : Lean.IR.JoinPointId) => "block_" ++ toString a.idx }
Equations
- Lean.IR.instToFormatJoinPointId = { format := fun (a : Lean.IR.JoinPointId) => Std.Format.text (toString a) }
Equations
- Lean.IR.instHashableJoinPointId = { hash := fun (a : Lean.IR.JoinPointId) => hash a.idx }
Equations
Instances For
Low Level IR types. Most are self explanatory.
usizerepresents the C++size_tType. We have it here because it is 32-bit in 32-bit machines, and 64-bit in 64-bit machines, and we want the C++ backend for our Compiler to generate platform independent code.irrelevantfor Lean types, propositions and proofs.objecta pointer to a value in the heap.tobjecta pointer to a value in the heap or tagged pointer (i.e., the least significant bit is 1) storing a scalar value.structandunionare used to return small values (e.g.,Option,Prod,Except) on the stack.
Remark: the RC operations for tobject are slightly more expensive because we
first need to test whether the tobject is really a pointer or not.
Remark: the Lean runtime assumes that sizeof(void*) == sizeof(sizeT). Lean cannot be compiled on old platforms where this is not True.
Since values of type struct and union are only used to return values,
We assume they must be used/consumed "linearly". We use the term "linear" here
to mean "exactly once" in each execution. That is, given x : S, where S is a struct,
then one of the following must hold in each (execution) branch.
1- x occurs only at a single ret x instruction. That is, it is being consumed by being returned.
2- x occurs only at a single ctor. That is, it is being "consumed" by being stored into another struct/union.
3- We extract (aka project) every single field of x exactly once. That is, we are consuming x by consuming each
of one of its components. Minor refinement: we don't need to consume scalar fields or struct/union
fields that do not contain object fields.
- float: Lean.IR.IRType
- uint8: Lean.IR.IRType
- uint16: Lean.IR.IRType
- uint32: Lean.IR.IRType
- uint64: Lean.IR.IRType
- usize: Lean.IR.IRType
- irrelevant: Lean.IR.IRType
- object: Lean.IR.IRType
- tobject: Lean.IR.IRType
- struct: Option Lake.Name → Array Lean.IR.IRType → Lean.IR.IRType
- union: Lake.Name → Array Lean.IR.IRType → Lean.IR.IRType
Instances For
Equations
- Lean.IR.instInhabitedIRType = { default := Lean.IR.IRType.float }
Equations
- Lean.IR.IRType.instBEq = { beq := Lean.IR.IRType.beq }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- x.isObj = match x with | Lean.IR.IRType.object => true | Lean.IR.IRType.tobject => true | x => false
Instances For
Equations
- x.isIrrelevant = match x with | Lean.IR.IRType.irrelevant => true | x => false
Instances For
Equations
- x.isStruct = match x with | Lean.IR.IRType.struct leanTypeName types => true | x => false
Instances For
Equations
- x.isUnion = match x with | Lean.IR.IRType.union leanTypeName types => true | x => false
Instances For
Arguments to applications, constructors, etc.
We use irrelevant for Lean types, propositions and proofs that have been erased.
Recall that for a Function f, we also generate f._rarg which does not take
irrelevant arguments. However, f._rarg is only safe to be used in full applications.
- var: Lean.IR.VarId → Lean.IR.Arg
- irrelevant: Lean.IR.Arg
Instances For
Equations
- Lean.IR.instInhabitedArg = { default := Lean.IR.Arg.var default }
Equations
- x✝.beq x = match x✝, x with | Lean.IR.Arg.var x, Lean.IR.Arg.var y => x == y | Lean.IR.Arg.irrelevant, Lean.IR.Arg.irrelevant => true | x, x_1 => false
Instances For
Equations
- Lean.IR.instBEqArg = { beq := Lean.IR.Arg.beq }
- num: Nat → Lean.IR.LitVal
- str: String → Lean.IR.LitVal
Instances For
Equations
- x✝.beq x = match x✝, x with | Lean.IR.LitVal.num v₁, Lean.IR.LitVal.num v₂ => v₁ == v₂ | Lean.IR.LitVal.str v₁, Lean.IR.LitVal.str v₂ => v₁ == v₂ | x, x_1 => false
Instances For
Equations
- Lean.IR.instBEqLitVal = { beq := Lean.IR.LitVal.beq }
Constructor information.
nameis the Name of the Constructor in Lean.cidxis the Constructor index (aka tag).sizeis the number of arguments of typeobject/tobject.usizeis the number of arguments of typeusize.ssizeis the number of bytes used to store scalar values.
Recall that a Constructor object contains a header, then a sequence of
pointers to other Lean objects, a sequence of USize (i.e., size_t)
scalar values, and a sequence of other scalar values.
Instances For
Equations
- Lean.IR.instReprCtorInfo = { reprPrec := Lean.IR.reprCtorInfo✝ }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.IR.instBEqCtorInfo = { beq := Lean.IR.CtorInfo.beq }
Instances For
- ctor: Lean.IR.CtorInfo → Array Lean.IR.Arg → Lean.IR.Expr
- reset: Nat → Lean.IR.VarId → Lean.IR.Expr
- reuse: Lean.IR.VarId → Lean.IR.CtorInfo → Bool → Array Lean.IR.Arg → Lean.IR.Expr
- proj: Nat → Lean.IR.VarId → Lean.IR.Expr
- uproj: Nat → Lean.IR.VarId → Lean.IR.Expr
Extract the
Usizevalue at Positionsizeof(void*)*ifromx. - sproj: Nat → Nat → Lean.IR.VarId → Lean.IR.Expr
Extract the scalar value at Position
sizeof(void*)*n + offsetfromx. - fap: Lean.IR.FunId → Array Lean.IR.Arg → Lean.IR.Expr
Full application.
- pap: Lean.IR.FunId → Array Lean.IR.Arg → Lean.IR.Expr
Partial application that creates a
papvalue (aka closure in our nonstandard terminology). - ap: Lean.IR.VarId → Array Lean.IR.Arg → Lean.IR.Expr
- box: Lean.IR.IRType → Lean.IR.VarId → Lean.IR.Expr
- unbox: Lean.IR.VarId → Lean.IR.Expr
Given
x : [t]object, obtain the scalar value. - lit: Lean.IR.LitVal → Lean.IR.Expr
Instances For
Equations
- Lean.IR.mkCtorExpr n cidx size usize ssize ys = Lean.IR.Expr.ctor { name := n, cidx := cidx, size := size, usize := usize, ssize := ssize } ys
Instances For
Equations
- Lean.IR.mkUProjExpr i x = Lean.IR.Expr.uproj i x
Instances For
Equations
- Lean.IR.mkSProjExpr n offset x = Lean.IR.Expr.sproj n offset x
Instances For
Equations
- Lean.IR.mkFAppExpr c ys = Lean.IR.Expr.fap c ys
Instances For
Equations
- Lean.IR.mkPAppExpr c ys = Lean.IR.Expr.pap c ys
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.IR.instInhabitedParam = { default := { x := default, borrow := default, ty := default } }
Equations
- Lean.IR.mkParam x borrow ty = { x := x, borrow := borrow, ty := ty }
Instances For
- ctor: {FnBody : Type} → Lean.IR.CtorInfo → FnBody → Lean.IR.AltCore FnBody
- default: {FnBody : Type} → FnBody → Lean.IR.AltCore FnBody
Instances For
- vdecl: Lean.IR.VarId → Lean.IR.IRType → Lean.IR.Expr → Lean.IR.FnBody → Lean.IR.FnBody
- jdecl: Lean.IR.JoinPointId → Array Lean.IR.Param → Lean.IR.FnBody → Lean.IR.FnBody → Lean.IR.FnBody
Join point Declaration
block_j (xs) := e; b - set: Lean.IR.VarId → Nat → Lean.IR.Arg → Lean.IR.FnBody → Lean.IR.FnBody
- setTag: Lean.IR.VarId → Nat → Lean.IR.FnBody → Lean.IR.FnBody
- uset: Lean.IR.VarId → Nat → Lean.IR.VarId → Lean.IR.FnBody → Lean.IR.FnBody
- sset: Lean.IR.VarId → Nat → Nat → Lean.IR.VarId → Lean.IR.IRType → Lean.IR.FnBody → Lean.IR.FnBody
- inc: Lean.IR.VarId → Nat → Bool → Bool → Lean.IR.FnBody → Lean.IR.FnBody
- dec: Lean.IR.VarId → Nat → Bool → Bool → Lean.IR.FnBody → Lean.IR.FnBody
- del: Lean.IR.VarId → Lean.IR.FnBody → Lean.IR.FnBody
- mdata: Lean.IR.MData → Lean.IR.FnBody → Lean.IR.FnBody
- case: Lake.Name → Lean.IR.VarId → Lean.IR.IRType → Array (Lean.IR.AltCore Lean.IR.FnBody) → Lean.IR.FnBody
- ret: Lean.IR.Arg → Lean.IR.FnBody
- jmp: Lean.IR.JoinPointId → Array Lean.IR.Arg → Lean.IR.FnBody
Jump to join point
j - unreachable: Lean.IR.FnBody
Instances For
Equations
- Lean.IR.instInhabitedFnBody = { default := Lean.IR.FnBody.unreachable }
Instances For
Equations
- Lean.IR.mkVDecl x ty e b = Lean.IR.FnBody.vdecl x ty e b
Instances For
Equations
- Lean.IR.mkJDecl j xs v b = Lean.IR.FnBody.jdecl j xs v b
Instances For
Equations
- Lean.IR.mkUSet x i y b = Lean.IR.FnBody.uset x i y b
Instances For
Equations
- Lean.IR.mkSSet x i offset y ty b = Lean.IR.FnBody.sset x i offset y ty b
Instances For
Equations
- Lean.IR.mkCase tid x cs = Lean.IR.FnBody.case tid x Lean.IR.IRType.object cs
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.IR.Alt.ctor = Lean.IR.AltCore.ctor
Instances For
Equations
- Lean.IR.Alt.default = Lean.IR.AltCore.default
Instances For
Equations
- Lean.IR.instInhabitedAlt = { default := Lean.IR.Alt.default default }
Equations
- x.isTerminal = match x with | Lean.IR.FnBody.case tid x xType cs => true | Lean.IR.FnBody.ret x => true | Lean.IR.FnBody.jmp j ys => true | Lean.IR.FnBody.unreachable => true | x => false
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
If b is a non terminal, then return a pair (c, b') s.t. b == c <;> b',
and c.body == FnBody.nil
Equations
- b.split = let b' := b.body; let c := b.resetBody; (c, b')
Instances For
Equations
- Lean.IR.AltCore.body x = match x with | Lean.IR.AltCore.ctor info b => b | Lean.IR.AltCore.default b => b
Instances For
Equations
- Lean.IR.AltCore.setBody x✝ x = match x✝, x with | Lean.IR.AltCore.ctor c b, b_1 => Lean.IR.Alt.ctor c b_1 | Lean.IR.AltCore.default b, b_1 => Lean.IR.Alt.default b_1
Instances For
Equations
- Lean.IR.AltCore.modifyBody f x = match x with | Lean.IR.AltCore.ctor c b => Lean.IR.Alt.ctor c (f b) | Lean.IR.AltCore.default b => Lean.IR.Alt.default (f b)
Instances For
Equations
- Lean.IR.AltCore.mmodifyBody f x = match x with | Lean.IR.AltCore.ctor c b => Lean.IR.Alt.ctor c <$> f b | Lean.IR.AltCore.default b => Lean.IR.Alt.default <$> f b
Instances For
Equations
- x.isDefault = match x with | Lean.IR.AltCore.ctor info b => false | Lean.IR.AltCore.default b => true
Instances For
Equations
- Lean.IR.push bs b = let b := b.resetBody; bs.push b
Instances For
Equations
- b.flatten = Lean.IR.flattenAux b #[]
Instances For
Equations
- Lean.IR.reshape bs term = Lean.IR.reshapeAux bs bs.size term
Instances For
Equations
- Lean.IR.modifyJPs bs f = Array.map (fun (b : Lean.IR.FnBody) => match b with | Lean.IR.FnBody.jdecl j xs v k => Lean.IR.FnBody.jdecl j xs (f v) k | other => other) bs
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.IR.mkAlt n cidx size usize ssize b = Lean.IR.Alt.ctor { name := n, cidx := cidx, size := size, usize := usize, ssize := ssize } b
Instances For
Extra information associated with a declaration.
If
some <blame>, then declaration depends on<blame>which uses asorryaxiom.
Instances For
- fdecl: Lean.IR.FunId → Array Lean.IR.Param → Lean.IR.IRType → Lean.IR.FnBody → Lean.IR.DeclInfo → Lean.IR.Decl
- extern: Lean.IR.FunId → Array Lean.IR.Param → Lean.IR.IRType → Lean.ExternAttrData → Lean.IR.Decl
Instances For
Equations
- Lean.IR.instInhabitedDecl = { default := Lean.IR.Decl.extern default default default default }
Equations
- x.name = match x with | Lean.IR.Decl.fdecl f xs type body info => f | Lean.IR.Decl.extern f xs type ext => f
Instances For
Equations
- x.params = match x with | Lean.IR.Decl.fdecl f xs type body info => xs | Lean.IR.Decl.extern f xs type ext => xs
Instances For
Equations
- x.resultType = match x with | Lean.IR.Decl.fdecl f xs t body info => t | Lean.IR.Decl.extern f xs t ext => t
Instances For
Equations
- x.isExtern = match x with | Lean.IR.Decl.extern f xs type ext => true | x => false
Instances For
Equations
- x.getInfo = match x with | Lean.IR.Decl.fdecl f xs type body info => info | x => { sorryDep? := none }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.IR.mkDecl f xs ty b = Lean.IR.Decl.fdecl f xs ty b { sorryDep? := none }
Instances For
Equations
- Lean.IR.mkExternDecl f xs ty e = Lean.IR.Decl.extern f xs ty e
Instances For
Equations
- Lean.IR.mkDummyExternDecl f xs ty = Lean.IR.Decl.fdecl f xs ty Lean.IR.FnBody.unreachable { sorryDep? := none }
Instances For
Set of variable and join point names
Equations
- Lean.IR.IndexSet = Lean.RBTree Lean.IR.Index compare
Instances For
Equations
- Lean.IR.instInhabitedIndexSet = { default := ∅ }
Equations
- Lean.IR.mkIndexSet idx = Lean.RBTree.empty.insert idx
Instances For
- param: Lean.IR.IRType → Lean.IR.LocalContextEntry
- localVar: Lean.IR.IRType → Lean.IR.Expr → Lean.IR.LocalContextEntry
- joinPoint: Array Lean.IR.Param → Lean.IR.FnBody → Lean.IR.LocalContextEntry
Instances For
Equations
Instances For
Equations
- ctx.addLocal x t v = Lean.RBMap.insert ctx x.idx (Lean.IR.LocalContextEntry.localVar t v)
Instances For
Equations
- ctx.addJP j xs b = Lean.RBMap.insert ctx j.idx (Lean.IR.LocalContextEntry.joinPoint xs b)
Instances For
Equations
- ctx.addParam p = Lean.RBMap.insert ctx p.x.idx (Lean.IR.LocalContextEntry.param p.ty)
Instances For
Equations
- ctx.addParams ps = Array.foldl Lean.IR.LocalContext.addParam ctx ps 0
Instances For
Equations
- ctx.isJP idx = match Lean.RBMap.find? ctx idx with | some (Lean.IR.LocalContextEntry.joinPoint a a_1) => true | x => false
Instances For
Equations
- ctx.getJPBody j = match Lean.RBMap.find? ctx j.idx with | some (Lean.IR.LocalContextEntry.joinPoint a b) => some b | x => none
Instances For
Equations
- ctx.getJPParams j = match Lean.RBMap.find? ctx j.idx with | some (Lean.IR.LocalContextEntry.joinPoint ys a) => some ys | x => none
Instances For
Equations
- ctx.isParam idx = match Lean.RBMap.find? ctx idx with | some (Lean.IR.LocalContextEntry.param a) => true | x => false
Instances For
Equations
- ctx.isLocalVar idx = match Lean.RBMap.find? ctx idx with | some (Lean.IR.LocalContextEntry.localVar a a_1) => true | x => false
Instances For
Equations
- ctx.contains idx = Lean.RBMap.contains ctx idx
Instances For
Equations
- ctx.eraseJoinPointDecl j = Lean.RBMap.erase ctx j.idx
Instances For
Equations
- ctx.getType x = match Lean.RBMap.find? ctx x.idx with | some (Lean.IR.LocalContextEntry.param t) => some t | some (Lean.IR.LocalContextEntry.localVar t a) => some t | x => none
Instances For
Equations
- ctx.getValue x = match Lean.RBMap.find? ctx x.idx with | some (Lean.IR.LocalContextEntry.localVar a v) => some v | x => none
Instances For
Equations
Instances For
Equations
- Lean.IR.VarId.alphaEqv ρ v₁ v₂ = match Lean.RBMap.find? ρ v₁.idx with | some v => v == v₂.idx | none => v₁ == v₂
Instances For
Equations
- Lean.IR.instAlphaEqvVarId = { aeqv := Lean.IR.VarId.alphaEqv }
Equations
- Lean.IR.Arg.alphaEqv ρ x✝ x = match x✝, x with | Lean.IR.Arg.var v₁, Lean.IR.Arg.var v₂ => Lean.IR.aeqv ρ v₁ v₂ | Lean.IR.Arg.irrelevant, Lean.IR.Arg.irrelevant => true | x, x_1 => false
Instances For
Equations
- Lean.IR.instAlphaEqvArg = { aeqv := Lean.IR.Arg.alphaEqv }
Equations
- Lean.IR.args.alphaEqv ρ args₁ args₂ = args₁.isEqv args₂ fun (a b : Lean.IR.Arg) => Lean.IR.aeqv ρ a b
Instances For
Equations
- Lean.IR.instAlphaEqvArrayArg = { aeqv := Lean.IR.args.alphaEqv }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Lean.IR.instAlphaEqvExpr = { aeqv := Lean.IR.Expr.alphaEqv }
Equations
- Lean.IR.addVarRename ρ x₁ x₂ = if (x₁ == x₂) = true then ρ else Lean.RBMap.insert ρ x₁ x₂
Instances For
Equations
- Lean.IR.addParamRename ρ p₁ p₂ = if (p₁.ty == p₂.ty && decide (p₁.borrow = p₂.borrow)) = true then some (Lean.IR.addVarRename ρ p₁.x.idx p₂.x.idx) else none
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- b₁.beq b₂ = Lean.IR.FnBody.alphaEqv ∅ b₁ b₂
Instances For
Equations
- Lean.IR.instBEqFnBody = { beq := Lean.IR.FnBody.beq }
Equations
- Lean.IR.VarIdSet = Lean.RBTree Lean.IR.VarId fun (x y : Lean.IR.VarId) => compare x.idx y.idx
Instances For
Equations
- Lean.IR.instInhabitedVarIdSet = { default := ∅ }
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.