Skip to content

Commit 2a9fa0b

Browse files
GulinSSspcfox
andcommitted
[ refactor ] ScopedSnocList: Swap Scope on SnocList (Phase 2)
Co-authored-by: Viktor Yudov <[email protected]>
1 parent a8c6014 commit 2a9fa0b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2018
-1785
lines changed

src/Compiler/ANF.idr

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,11 @@ Show ANFDef where
139139
show (MkAError exp) = "Error: " ++ show exp
140140

141141
data AVars : Scoped where
142-
Nil : AVars ScopeEmpty
143-
(::) : Int -> AVars xs -> AVars (x :: xs)
142+
Lin : AVars ScopeEmpty
143+
(:<) : AVars xs -> Int -> AVars (xs :< x)
144144

145145
ScopeEmpty : AVars ScopeEmpty
146-
ScopeEmpty = []
146+
ScopeEmpty = [<]
147147

148148
data Next : Type where
149149

@@ -155,8 +155,8 @@ nextVar
155155
pure i
156156

157157
lookup : {idx : _} -> (0 p : IsVar x idx vs) -> AVars vs -> Int
158-
lookup First (x :: xs) = x
159-
lookup (Later p) (x :: xs) = lookup p xs
158+
lookup First (xs :< x) = x
159+
lookup (Later p) (xs :< x) = lookup p xs
160160

161161
bindArgs : {auto v : Ref Next Int} ->
162162
List ANF -> Core (List (AVar, Maybe ANF))
@@ -192,6 +192,15 @@ mlet fc val sc
192192
= do i <- nextVar
193193
pure $ ALet fc i val (sc (ALocal i))
194194

195+
bindAsFresh :
196+
{auto v : Ref Next Int} ->
197+
(args : List Name) -> AVars vars' ->
198+
Core (List Int, AVars (vars' <>< args))
199+
bindAsFresh [] vs = pure ([], vs)
200+
bindAsFresh (n :: ns) vs
201+
= do i <- nextVar
202+
mapFst (i ::) <$> bindAsFresh ns (vs :< i)
203+
195204
mutual
196205
anfArgs : {vars : _} ->
197206
{auto v : Ref Next Int} ->
@@ -216,7 +225,7 @@ mutual
216225
_ => ACrash fc "Can't happen (AApp)"
217226
anf vs (LLet fc x val sc)
218227
= do i <- nextVar
219-
let vs' = i :: vs
228+
let vs' = vs :< i
220229
pure $ ALet fc i !(anf vs val) !(anf vs' sc)
221230
anf vs (LCon fc n ci t args)
222231
= anfArgs fc vs args (ACon fc n ci t)
@@ -246,16 +255,8 @@ mutual
246255
{auto v : Ref Next Int} ->
247256
AVars vars -> LiftedConAlt vars -> Core AConAlt
248257
anfConAlt vs (MkLConAlt n ci t args sc)
249-
= do (is, vs') <- bindArgs args vs
258+
= do (is, vs') <- bindAsFresh args vs
250259
pure $ MkAConAlt n ci t is !(anf vs' sc)
251-
where
252-
bindArgs : (args : List Name) -> AVars vars' ->
253-
Core (List Int, AVars (args ++ vars'))
254-
bindArgs [] vs = pure ([], vs)
255-
bindArgs (n :: ns) vs
256-
= do i <- nextVar
257-
(is, vs') <- bindArgs ns vs
258-
pure (i :: is, i :: vs')
259260

260261
anfConstAlt : {vars : _} ->
261262
{auto v : Ref Next Int} ->
@@ -267,20 +268,13 @@ export
267268
toANF : LiftedDef -> Core ANFDef
268269
toANF (MkLFun args scope sc)
269270
= do v <- newRef Next (the Int 0)
270-
(iargs, vsNil) <- bindArgs args []
271-
let vs : AVars args = rewrite sym (appendNilRightNeutral args) in
272-
vsNil
273-
(iargs', vs) <- bindArgs scope vs
274-
pure $ MkAFun (iargs ++ reverse iargs') !(anf vs sc)
275-
where
276-
bindArgs : {auto v : Ref Next Int} ->
277-
(args : List Name) -> AVars vars' ->
278-
Core (List Int, AVars (args ++ vars'))
279-
bindArgs [] vs = pure ([], vs)
280-
bindArgs (n :: ns) vs
281-
= do i <- nextVar
282-
(is, vs') <- bindArgs ns vs
283-
pure (i :: is, i :: vs')
271+
(iargs, vsNil) <- bindAsFresh (cast args) [<]
272+
let vs : AVars args
273+
:= rewrite sym $ appendLinLeftNeutral args in
274+
rewrite snocAppendAsFish [<] args in vsNil
275+
(iargs', vs) <- bindAsFresh (cast scope) vs
276+
sc' <- anf (rewrite snocAppendAsFish args scope in vs) sc
277+
pure $ MkAFun (iargs ++ iargs') sc'
284278
toANF (MkLCon t a ns) = pure $ MkACon t a ns
285279
toANF (MkLForeign ccs fargs t) = pure $ MkAForeign ccs fargs t
286280
toANF (MkLError err)

src/Compiler/CaseOpts.idr

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,38 +37,38 @@ case t of
3737

3838
shiftUnder : {args : _} ->
3939
{idx : _} ->
40-
(0 p : IsVar n idx (x :: args ++ vars)) ->
41-
NVar n (args ++ x :: vars)
40+
(0 p : IsVar n idx (vars ++ args :< x)) ->
41+
NVar n (vars :< x ++ args)
4242
shiftUnder First = weakenNVar (mkSizeOf args) (MkNVar First)
4343
shiftUnder (Later p) = insertNVar (mkSizeOf args) (MkNVar p)
4444

4545
shiftVar : {outer : Scope} -> {args : List Name} ->
46-
NVar n (outer ++ (x :: args ++ vars)) ->
47-
NVar n (outer ++ (args ++ x :: vars))
46+
NVar n ((vars <>< args :< x) ++ outer) ->
47+
NVar n ((vars :< x <>< args) ++ outer)
4848
shiftVar nvar
4949
= let out = mkSizeOf outer in
5050
case locateNVar out nvar of
5151
Left nvar => embed nvar
52-
Right (MkNVar p) => weakenNs out (shiftUnder p)
52+
Right (MkNVar p) => weakenNs out (shiftUndersN (mkSizeOf _) p)
5353

5454
mutual
55+
renameVar : IsVar x i ((vars :< old <>< args) ++ local) ->
56+
IsVar x i ((vars :< new <>< args) ++ local)
57+
renameVar = believe_me -- it's the same index, so just the identity at run time
58+
5559
shiftBinder : {outer, args : _} ->
5660
(new : Name) ->
57-
CExp (outer ++ old :: (args ++ vars)) ->
58-
CExp (outer ++ (args ++ new :: vars))
61+
CExp (((vars <>< args) :< old) ++ outer) ->
62+
CExp ((vars :< new <>< args) ++ outer)
5963
shiftBinder new (CLocal fc p)
6064
= case shiftVar (MkNVar p) of
6165
MkNVar p' => CLocal fc (renameVar p')
62-
where
63-
renameVar : IsVar x i (outer ++ (args ++ (old :: rest))) ->
64-
IsVar x i (outer ++ (args ++ (new :: rest)))
65-
renameVar = believe_me -- it's the same index, so just the identity at run time
6666
shiftBinder new (CRef fc n) = CRef fc n
6767
shiftBinder {outer} new (CLam fc n sc)
68-
= CLam fc n $ shiftBinder {outer = n :: outer} new sc
68+
= CLam fc n $ shiftBinder {outer = outer :< n} new sc
6969
shiftBinder new (CLet fc n inlineOK val sc)
7070
= CLet fc n inlineOK (shiftBinder new val)
71-
$ shiftBinder {outer = n :: outer} new sc
71+
$ shiftBinder {outer = outer :< n} new sc
7272
shiftBinder new (CApp fc f args)
7373
= CApp fc (shiftBinder new f) $ map (shiftBinder new) args
7474
shiftBinder new (CCon fc ci c tag args)
@@ -92,34 +92,34 @@ mutual
9292

9393
shiftBinderConAlt : {outer, args : _} ->
9494
(new : Name) ->
95-
CConAlt (outer ++ (x :: args ++ vars)) ->
96-
CConAlt (outer ++ (args ++ new :: vars))
95+
CConAlt (((vars <>< args) :< old) ++ outer) ->
96+
CConAlt ((vars :< new <>< args) ++ outer)
9797
shiftBinderConAlt new (MkConAlt n ci t args' sc)
98-
= let sc' : CExp ((args' ++ outer) ++ (x :: args ++ vars))
99-
= rewrite sym (appendAssociative args' outer (x :: args ++ vars)) in sc in
98+
= let sc' : CExp (((vars <>< args) :< old) ++ (outer <>< args'))
99+
= rewrite sym $ snocAppendFishAssociative (vars <>< args :< old) outer args' in sc in
100100
MkConAlt n ci t args' $
101-
rewrite (appendAssociative args' outer (args ++ new :: vars))
102-
in shiftBinder new {outer = args' ++ outer} sc'
101+
rewrite snocAppendFishAssociative (vars :< new <>< args) outer args'
102+
in shiftBinder new {outer = outer <>< args'} sc'
103103

104104
shiftBinderConstAlt : {outer, args : _} ->
105105
(new : Name) ->
106-
CConstAlt (outer ++ (x :: args ++ vars)) ->
107-
CConstAlt (outer ++ (args ++ new :: vars))
106+
CConstAlt (((vars <>< args) :< old) ++ outer) ->
107+
CConstAlt ((vars :< new <>< args) ++ outer)
108108
shiftBinderConstAlt new (MkConstAlt c sc) = MkConstAlt c $ shiftBinder new sc
109109

110110
-- If there's a lambda inside a case, move the variable so that it's bound
111111
-- outside the case block so that we can bind it just once outside the block
112112
liftOutLambda : {args : _} ->
113113
(new : Name) ->
114-
CExp (old :: args ++ vars) ->
115-
CExp (args ++ new :: vars)
114+
CExp (vars <>< args :< old) ->
115+
CExp (vars :< new <>< args)
116116
liftOutLambda = shiftBinder {outer = ScopeEmpty}
117117

118118
-- If all the alternatives start with a lambda, we can have a single lambda
119119
-- binding outside
120120
tryLiftOut : (new : Name) ->
121121
List (CConAlt vars) ->
122-
Maybe (List (CConAlt (new :: vars)))
122+
Maybe (List (CConAlt (vars :< new)))
123123
tryLiftOut new [] = Just []
124124
tryLiftOut new (MkConAlt n ci t args (CLam fc x sc) :: as)
125125
= do as' <- tryLiftOut new as
@@ -129,7 +129,7 @@ tryLiftOut _ _ = Nothing
129129

130130
tryLiftOutConst : (new : Name) ->
131131
List (CConstAlt vars) ->
132-
Maybe (List (CConstAlt (new :: vars)))
132+
Maybe (List (CConstAlt (vars :< new)))
133133
tryLiftOutConst new [] = Just []
134134
tryLiftOutConst new (MkConstAlt c (CLam fc x sc) :: as)
135135
= do as' <- tryLiftOutConst new as
@@ -139,7 +139,7 @@ tryLiftOutConst _ _ = Nothing
139139

140140
tryLiftDef : (new : Name) ->
141141
Maybe (CExp vars) ->
142-
Maybe (Maybe (CExp (new :: vars)))
142+
Maybe (Maybe (CExp (vars :< new)))
143143
tryLiftDef new Nothing = Just Nothing
144144
tryLiftDef new (Just (CLam fc x sc))
145145
= let sc' = liftOutLambda {args = []} new sc in
@@ -318,8 +318,8 @@ doCaseOfCase fc x xalts xdef alts def
318318
updateAlt (MkConAlt n ci t args sc)
319319
= MkConAlt n ci t args $
320320
CConCase fc sc
321-
(map (weakenNs (mkSizeOf args)) alts)
322-
(map (weakenNs (mkSizeOf args)) def)
321+
(map (weakensN (mkSizeOf args)) alts)
322+
(map (weakensN (mkSizeOf args)) def)
323323

324324
updateDef : CExp vars -> CExp vars
325325
updateDef sc = CConCase fc sc alts def

0 commit comments

Comments
 (0)