Skip to content

Commit

Permalink
ScopedSnocList: WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
GulinSS committed Oct 8, 2024
1 parent f840d1b commit 5089a92
Show file tree
Hide file tree
Showing 105 changed files with 2,441 additions and 2,217 deletions.
6 changes: 3 additions & 3 deletions libs/base/Data/SnocList/HasLength.idr
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ map f Z = Z
map f (S hl) = S (map f hl)

export
sucL : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
sucL Z = S Z
sucL (S n) = S (sucL n)
sucR : HasLength n sx -> HasLength (S n) ([<x] ++ sx)
sucR Z = S Z
sucR (S n) = S (sucR n)

export
hlAppend : HasLength m sx -> HasLength n sy -> HasLength (n + m) (sx ++ sy)
Expand Down
27 changes: 14 additions & 13 deletions src/Compiler/ANF.idr
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import Core.Core
import Core.TT

import Data.List
import Data.SnocList
import Data.Vect
import Libraries.Data.SortedSet

Expand Down Expand Up @@ -136,9 +137,9 @@ Show ANFDef where
show args ++ " -> " ++ show ret
show (MkAError exp) = "Error: " ++ show exp

data AVars : List Name -> Type where
Nil : AVars []
(::) : Int -> AVars xs -> AVars (x :: xs)
data AVars : SnocList Name -> Type where
Nil : AVars [<]
(::) : Int -> AVars xs -> AVars (xs :< x)

data Next : Type where

Expand Down Expand Up @@ -194,7 +195,7 @@ mutual
List (Lifted vars) -> (List AVar -> ANF) -> Core ANF
anfArgs fc vs args f
= do args' <- traverse (anf vs) args
letBind fc args' f
letBind fc (toList args') f

anf : {vars : _} ->
{auto v : Ref Next Int} ->
Expand Down Expand Up @@ -244,10 +245,10 @@ mutual
= do (is, vs') <- bindArgs args vs
pure $ MkAConAlt n ci t is !(anf vs' sc)
where
bindArgs : (args : List Name) -> AVars vars' ->
Core (List Int, AVars (args ++ vars'))
bindArgs [] vs = pure ([], vs)
bindArgs (n :: ns) vs
bindArgs : (args : SnocList Name) -> AVars vars' ->
Core (List Int, AVars (vars' ++ args))
bindArgs [<] vs = pure ([], vs)
bindArgs (ns :< n) vs
= do i <- nextVar
(is, vs') <- bindArgs ns vs
pure (i :: is, i :: vs')
Expand All @@ -263,16 +264,16 @@ toANF : LiftedDef -> Core ANFDef
toANF (MkLFun args scope sc)
= do v <- newRef Next (the Int 0)
(iargs, vsNil) <- bindArgs args []
let vs : AVars args = rewrite sym (appendNilRightNeutral args) in
let vs : AVars args = rewrite sym (appendLinLeftNeutral args) in
vsNil
(iargs', vs) <- bindArgs scope vs
pure $ MkAFun (iargs ++ reverse iargs') !(anf vs sc)
where
bindArgs : {auto v : Ref Next Int} ->
(args : List Name) -> AVars vars' ->
Core (List Int, AVars (args ++ vars'))
bindArgs [] vs = pure ([], vs)
bindArgs (n :: ns) vs
(args : SnocList Name) -> AVars vars' ->
Core (List Int, AVars (vars' ++ args))
bindArgs [<] vs = pure ([], vs)
bindArgs (ns :< n) vs
= do i <- nextVar
(is, vs') <- bindArgs ns vs
pure (i :: is, i :: vs')
Expand Down
55 changes: 29 additions & 26 deletions src/Compiler/CaseOpts.idr
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ import Core.FC
import Core.TT

import Data.List
import Data.SnocList
import Data.Vect

import Libraries.Data.SnocList.SizeOf

%default covering

{-
Expand All @@ -32,14 +35,14 @@ case t of

shiftUnder : {args : _} ->
{idx : _} ->
(0 p : IsVar n idx (x :: args ++ vars)) ->
NVar n (args ++ x :: vars)
(0 p : IsVar n idx (vars ++ args :< x)) ->
NVar n (vars :< x ++ args)
shiftUnder First = weakenNVar (mkSizeOf args) (MkNVar First)
shiftUnder (Later p) = insertNVar (mkSizeOf args) (MkNVar p)

shiftVar : {outer, args : Scope} ->
NVar n (outer ++ (x :: args ++ vars)) ->
NVar n (outer ++ (args ++ x :: vars))
NVar n (((vars ++ args) :< x) ++ outer) ->
NVar n ((vars :< x ++ args) ++ outer)
shiftVar nvar
= let out = mkSizeOf outer in
case locateNVar out nvar of
Expand All @@ -49,21 +52,21 @@ shiftVar nvar
mutual
shiftBinder : {outer, args : _} ->
(new : Name) ->
CExp (outer ++ old :: (args ++ vars)) ->
CExp (outer ++ (args ++ new :: vars))
CExp ((vars ++ args :< old) ++ outer) ->
CExp ((vars :< new ++ args) ++ outer)
shiftBinder new (CLocal fc p)
= case shiftVar (MkNVar p) of
MkNVar p' => CLocal fc (renameVar p')
where
renameVar : IsVar x i (outer ++ (args ++ (old :: rest))) ->
IsVar x i (outer ++ (args ++ (new :: rest)))
renameVar : IsVar x i ((rest :< old ++ args) ++ outer) ->
IsVar x i ((rest :< new ++ args) ++ outer)
renameVar = believe_me -- it's the same index, so just the identity at run time
shiftBinder new (CRef fc n) = CRef fc n
shiftBinder {outer} new (CLam fc n sc)
= CLam fc n $ shiftBinder {outer = n :: outer} new sc
= CLam fc n $ shiftBinder {outer = outer :< n} new sc
shiftBinder new (CLet fc n inlineOK val sc)
= CLet fc n inlineOK (shiftBinder new val)
$ shiftBinder {outer = n :: outer} new sc
$ shiftBinder {outer = outer :< n} new sc
shiftBinder new (CApp fc f args)
= CApp fc (shiftBinder new f) $ map (shiftBinder new) args
shiftBinder new (CCon fc ci c tag args)
Expand All @@ -87,34 +90,34 @@ mutual

shiftBinderConAlt : {outer, args : _} ->
(new : Name) ->
CConAlt (outer ++ (x :: args ++ vars)) ->
CConAlt (outer ++ (args ++ new :: vars))
CConAlt ((vars ++ args :< x) ++ outer) ->
CConAlt ((vars :< new ++ args) ++ outer)
shiftBinderConAlt new (MkConAlt n ci t args' sc)
= let sc' : CExp ((args' ++ outer) ++ (x :: args ++ vars))
= rewrite sym (appendAssociative args' outer (x :: args ++ vars)) in sc in
= let sc' : CExp ((vars ++ args :< x) ++ (outer ++ args'))
= rewrite appendAssociative (vars ++ args :< x) outer args' in sc in
MkConAlt n ci t args' $
rewrite (appendAssociative args' outer (args ++ new :: vars))
in shiftBinder new {outer = args' ++ outer} sc'
rewrite (sym $ appendAssociative (vars :< new ++ args) outer args')
in shiftBinder new {outer = outer ++ args'} sc'

shiftBinderConstAlt : {outer, args : _} ->
(new : Name) ->
CConstAlt (outer ++ (x :: args ++ vars)) ->
CConstAlt (outer ++ (args ++ new :: vars))
CConstAlt ((vars ++ args :< x) ++ outer) ->
CConstAlt ((vars :< new ++ args) ++ outer)
shiftBinderConstAlt new (MkConstAlt c sc) = MkConstAlt c $ shiftBinder new sc

-- If there's a lambda inside a case, move the variable so that it's bound
-- outside the case block so that we can bind it just once outside the block
liftOutLambda : {args : _} ->
(new : Name) ->
CExp (old :: args ++ vars) ->
CExp (args ++ new :: vars)
liftOutLambda = shiftBinder {outer = []}
CExp (vars ++ args :< old) ->
CExp (vars :< new ++ args)
liftOutLambda = shiftBinder {outer = [<]}

-- If all the alternatives start with a lambda, we can have a single lambda
-- binding outside
tryLiftOut : (new : Name) ->
List (CConAlt vars) ->
Maybe (List (CConAlt (new :: vars)))
Maybe (List (CConAlt (vars :< new)))
tryLiftOut new [] = Just []
tryLiftOut new (MkConAlt n ci t args (CLam fc x sc) :: as)
= do as' <- tryLiftOut new as
Expand All @@ -124,20 +127,20 @@ tryLiftOut _ _ = Nothing

tryLiftOutConst : (new : Name) ->
List (CConstAlt vars) ->
Maybe (List (CConstAlt (new :: vars)))
Maybe (List (CConstAlt (vars :< new)))
tryLiftOutConst new [] = Just []
tryLiftOutConst new (MkConstAlt c (CLam fc x sc) :: as)
= do as' <- tryLiftOutConst new as
let sc' = liftOutLambda {args = []} new sc
let sc' = liftOutLambda {args = [<]} new sc
pure (MkConstAlt c sc' :: as')
tryLiftOutConst _ _ = Nothing

tryLiftDef : (new : Name) ->
Maybe (CExp vars) ->
Maybe (Maybe (CExp (new :: vars)))
Maybe (Maybe (CExp (vars :< new)))
tryLiftDef new Nothing = Just Nothing
tryLiftDef new (Just (CLam fc x sc))
= let sc' = liftOutLambda {args = []} new sc in
= let sc' = liftOutLambda {args = [<]} new sc in
pure (Just sc')
tryLiftDef _ _ = Nothing

Expand Down
10 changes: 5 additions & 5 deletions src/Compiler/Common.idr
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Ord UsePhase where
public export
record CompileData where
constructor MkCompileData
mainExpr : CExp [] -- main expression to execute. This also appears in
mainExpr : CExp [<] -- main expression to execute. This also appears in
-- the definitions below as MN "__mainExpression" 0
-- For incremental compilation and for compiling exported
-- names only, this can be set to 'erased'.
Expand Down Expand Up @@ -152,7 +152,7 @@ getMinimalDef (Coded ns bin)
name <- fromBuf b
let def
= MkGlobalDef fc name (Erased fc Placeholder) [] [] [] [] mul
[] (specified Public) (MkTotality Unchecked IsCovering) False
[<] (specified Public) (MkTotality Unchecked IsCovering) False
[] Nothing refsR False False True
None cdef Nothing [] Nothing
pure (def, Just (ns, bin))
Expand Down Expand Up @@ -351,8 +351,8 @@ getCompileDataWith exports doLazyAnnots phase_in tm_in
traverse (lambdaLift doLazyAnnots) cseDefs
else pure []

let lifted = (mainname, MkLFun [] [] liftedtm) ::
ldefs ++ concat lifted_in
let lifted = (mainname, MkLFun [<] [<] liftedtm) ::
(ldefs ++ concat lifted_in)

anf <- if phase >= ANF
then logTime 2 "Get ANF" $ traverse (\ (n, d) => pure (n, !(toANF d))) lifted
Expand Down Expand Up @@ -408,7 +408,7 @@ getCompileData = getCompileDataWith []

export
compileTerm : {auto c : Ref Ctxt Defs} ->
ClosedTerm -> Core (CExp [])
ClosedTerm -> Core (CExp [<])
compileTerm tm_in
= do tm <- toFullNames tm_in
fixArityExp !(compileExp tm)
Expand Down
Loading

0 comments on commit 5089a92

Please sign in to comment.