Documentation

Lean.Compiler.IR.Borrow

Equations

We perform borrow inference in a block of mutually recursive functions. Join points are viewed as local functions, and are identified using their local id + the name of the surrounding function. We keep a mapping from function and joint points to parameters (Array Param). Recall that Param contains the field borrow.

Equations
  • One or more equations did not get rendered due to their size.

Mark parameters that take a reference as borrow

Equations

We do perform borrow inference for constants marked as export. Reason: we current write wrappers in C++ for using exported functions. These wrappers use smart pointers such as object_ref. When writing a new wrapper we need to know whether an argument is a borrow inference or not. We can revise this decision when we implement code for generating the wrappers automatically.

Equations
Equations
  • One or more equations did not get rendered due to their size.

Apply the inferred borrow annotations stored at ParamMap to a block of mutually recursive functions.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    Equations
    Equations
    • One or more equations did not get rendered due to their size.

    Updates map[k] using the current set of owned variables.

    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.

    For each ps[i], if ps[i] is owned, then mark xs[i] as owned.

    Equations

    For each xs[i], if xs[i] is owned, then mark ps[i] as owned. We use this action to preserve tail calls. That is, if we have a tail call f xs, if the i-th parameter is borrowed, but xs[i] is owned we would have to insert a dec xs[i] after f xs and consequently "break" the tail call.

    Equations
    • One or more equations did not get rendered due to their size.

    Mark xs[i] as owned if it is one of the parameters ps. We use this action to mark function parameters that are being "packed" inside constructors. This is a heuristic, and is not related with the effectiveness of the reset/reuse optimization. It is useful for code such as

    def f (x y : obj) :=
    let z := ctor_1 x y;
    ret z
    
    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.

    Keep executing x until it reaches a fixpoint

    Equations
    • One or more equations did not get rendered due to their size.
    Equations
    • One or more equations did not get rendered due to their size.