This PR adds “sparse casesOn” constructions. They are similar to `.casesOn`, but have arms only for some constructors and a catch-all (providing `t.ctorIdx ≠ 42` assumptions). The compiler has native support for these constructors and now (because of the similarity) also the per-constructor elimination principles.
55 lines
1.3 KiB
Text
55 lines
1.3 KiB
Text
/-
|
|
Copyright (c) 2022 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Init.Data.FloatArray.Basic
|
|
public import Lean.CoreM
|
|
public import Lean.Util.Recognizers
|
|
|
|
public section
|
|
|
|
namespace Lean.Compiler.LCNF
|
|
/--
|
|
Return `true` if `mdata` should be preserved.
|
|
Right now, we don't preserve any `MData`, but this may
|
|
change in the future when we add support for debugging information
|
|
-/
|
|
def isCompilerRelevantMData (_mdata : MData) : Bool :=
|
|
false
|
|
|
|
/--
|
|
Return `true` if `e` is a `lcCast` application.
|
|
-/
|
|
def isLcCast? (e : Expr) : Option Expr :=
|
|
if e.isAppOfArity ``lcCast 3 then
|
|
some e.appArg!
|
|
else
|
|
none
|
|
|
|
def getCtorArity? (declName : Name) : CoreM (Option Nat) := do
|
|
let .ctorInfo val ← getConstInfo declName | return none
|
|
return val.numParams + val.numFields
|
|
|
|
/--
|
|
List of types that have builtin runtime support
|
|
-/
|
|
def builtinRuntimeTypes : Array Name := #[
|
|
``String,
|
|
``UInt8, ``UInt16, ``UInt32, ``UInt64, ``USize,
|
|
``Float, ``Float32,
|
|
``Thunk, ``Task,
|
|
``Array, ``ByteArray, ``FloatArray,
|
|
``Nat, ``Int
|
|
]
|
|
|
|
/--
|
|
Return `true` iff `declName` is the name of a type with builtin support in the runtime.
|
|
-/
|
|
def isRuntimeBuiltinType (declName : Name) : Bool :=
|
|
builtinRuntimeTypes.contains declName
|
|
|
|
end Lean.Compiler.LCNF
|