Skip to content

Commit dde0bf4

Browse files
mjustusGulinSS
authored andcommitted
[ refactor ] complete refactors regarding swapping inner/outer
1 parent b721167 commit dde0bf4

File tree

22 files changed

+195
-222
lines changed

22 files changed

+195
-222
lines changed

src/Compiler/ANF.idr

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,12 @@ mlet fc val sc
194194

195195
bindAsFresh :
196196
{auto v : Ref Next Int} ->
197-
(args : List Name) -> AVars vars' ->
198-
Core (List Int, AVars (Scope.ext vars' args))
199-
bindAsFresh [] vs = pure ([], vs)
200-
bindAsFresh (n :: ns) vs
197+
(args : Scope) -> AVars vars' ->
198+
Core (List Int, AVars (vars' ++ args))
199+
bindAsFresh [<] vs = pure ([], vs)
200+
bindAsFresh (ns :< n) vs
201201
= do i <- nextVar
202-
mapFst (i ::) <$> bindAsFresh ns (vs :< i)
202+
bimap (i ::) (:< i) <$> bindAsFresh ns vs
203203

204204
mutual
205205
anfArgs : {auto v : Ref Next Int} ->
@@ -211,7 +211,7 @@ mutual
211211

212212
anf : {auto v : Ref Next Int} ->
213213
AVars vars -> Lifted vars -> Core ANF
214-
anf vs (LLocal fc p) = pure $ AV fc (ALocal (lookup p vs))
214+
anf vs (LLocal fc p) = pure $ AV fc (ALocal (lookup vs p))
215215
anf vs (LAppName fc lazy n args)
216216
= anfArgs fc vs args (AAppName fc lazy n)
217217
anf vs (LUnderApp fc n m args)
@@ -264,12 +264,12 @@ export
264264
toANF : LiftedDef -> Core ANFDef
265265
toANF (MkLFun args scope sc)
266266
= do v <- newRef Next (the Int 0)
267-
(iargs, vsNil) <- bindAsFresh (cast args) AVars.empty
267+
(iargs, vsNil) <- bindAsFresh args AVars.empty
268268
let vs : AVars args
269269
:= rewrite sym $ appendLinLeftNeutral args in
270-
rewrite snocAppendAsFish Scope.empty args in vsNil
271-
(iargs', vs) <- bindAsFresh (cast scope) vs
272-
sc' <- anf (rewrite snocAppendAsFish args scope in vs) sc
270+
vsNil
271+
(iargs', vs) <- bindAsFresh scope vs
272+
sc' <- anf vs sc
273273
pure $ MkAFun (iargs ++ iargs') sc'
274274
toANF (MkLCon t a ns) = pure $ MkACon t a ns
275275
toANF (MkLForeign ccs fargs t) = pure $ MkAForeign ccs fargs t

src/Compiler/CaseOpts.idr

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,33 +42,33 @@ shiftUnder : {args : _} ->
4242
shiftUnder First = weakenNVar (mkSizeOf args) (MkNVar First)
4343
shiftUnder (Later p) = insertNVar (mkSizeOf args) (MkNVar p)
4444

45-
shiftVar : {outer : Scope} -> {args : List Name} ->
46-
NVar n ((vars <>< args :< x) ++ outer) ->
47-
NVar n ((vars :< x <>< args) ++ outer)
45+
shiftVar : {inner : Scope} -> {args : Scope} ->
46+
NVar n ((vars ++ args :< x) ++ inner) ->
47+
NVar n ((vars :< x ++ args) ++ inner)
4848
shiftVar nvar
49-
= let out = mkSizeOf outer in
50-
case locateNVar out nvar of
51-
Left nvar => embed nvar
52-
Right (MkNVar p) => weakenNs out (shiftUndersN (mkSizeOf _) p)
49+
= let inn = mkSizeOf inner in
50+
case locateNVar inn nvar of
51+
Left (MkNVar p) => weakenNs inn (shiftUnderNs (mkSizeOf args) p)
52+
Right nvar => embed nvar
5353

5454
mutual
55-
shiftBinder : {outer, args : _} ->
55+
shiftBinder : {inner, args : _} ->
5656
(new : Name) ->
57-
CExp (((vars <>< args) :< old) ++ outer) ->
58-
CExp ((vars :< new <>< args) ++ outer)
57+
CExp (((vars ++ args) :< old) ++ inner) ->
58+
CExp ((vars :< new ++ args) ++ inner)
5959
shiftBinder new (CLocal fc p)
6060
= case shiftVar (MkNVar p) of
6161
MkNVar p' => CLocal fc (renameVar p')
6262
where
63-
renameVar : IsVar x i ((vars :< old <>< args) ++ local) ->
64-
IsVar x i ((vars :< new <>< args) ++ local)
63+
renameVar : IsVar x i ((vars :< old ++ args) ++ local) ->
64+
IsVar x i ((vars :< new ++ args) ++ local)
6565
renameVar = believe_me -- it's the same index, so just the identity at run time
6666
shiftBinder new (CRef fc n) = CRef fc n
67-
shiftBinder {outer} new (CLam fc n sc)
68-
= CLam fc n $ shiftBinder {outer = outer :< n} new sc
67+
shiftBinder {inner} new (CLam fc n sc)
68+
= CLam fc n $ shiftBinder {inner = inner :< n} new sc
6969
shiftBinder new (CLet fc n inlineOK val sc)
7070
= CLet fc n inlineOK (shiftBinder new val)
71-
$ shiftBinder {outer = outer :< n} new sc
71+
$ shiftBinder {inner = inner :< 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)
@@ -90,30 +90,30 @@ mutual
9090
shiftBinder new (CErased fc) = CErased fc
9191
shiftBinder new (CCrash fc msg) = CCrash fc msg
9292

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

104-
shiftBinderConstAlt : {outer, args : _} ->
104+
shiftBinderConstAlt : {inner, args : _} ->
105105
(new : Name) ->
106-
CConstAlt (((vars <>< args) :< old) ++ outer) ->
107-
CConstAlt ((vars :< new <>< args) ++ outer)
106+
CConstAlt (((vars ++ args) :< old) ++ inner) ->
107+
CConstAlt ((vars :< new ++ args) ++ inner)
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 (Scope.bind (Scope.ext vars args) old) ->
115-
CExp (Scope.ext (Scope.bind vars new) args)
116-
liftOutLambda = shiftBinder {outer = Scope.empty}
114+
CExp (Scope.bind (Scope.addInner vars args) old) ->
115+
CExp (Scope.addInner (Scope.bind vars new) args)
116+
liftOutLambda = shiftBinder {inner = Scope.empty}
117117

118118
-- If all the alternatives start with a lambda, we can have a single lambda
119119
-- binding outside
@@ -133,7 +133,7 @@ tryLiftOutConst : (new : Name) ->
133133
tryLiftOutConst new [] = Just []
134134
tryLiftOutConst new (MkConstAlt c (CLam fc x sc) :: as)
135135
= do as' <- tryLiftOutConst new as
136-
let sc' = liftOutLambda {args = []} new sc
136+
let sc' = liftOutLambda {args = [<]} new sc
137137
pure (MkConstAlt c sc' :: as')
138138
tryLiftOutConst _ _ = Nothing
139139

@@ -142,7 +142,7 @@ tryLiftDef : (new : Name) ->
142142
Maybe (Maybe (CExp (Scope.bind vars new)))
143143
tryLiftDef new Nothing = Just Nothing
144144
tryLiftDef new (Just (CLam fc x sc))
145-
= let sc' = liftOutLambda {args = []} new sc in
145+
= let sc' = liftOutLambda {args = [<]} new sc in
146146
pure (Just sc')
147147
tryLiftDef _ _ = Nothing
148148

@@ -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 (weakensN (mkSizeOf args)) alts)
322-
(map (weakensN (mkSizeOf args)) def)
321+
(map (weakenNs (mkSizeOf args)) alts)
322+
(map (weakenNs (mkSizeOf args)) def)
323323

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

src/Compiler/CompileExpr.idr

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ etaExpand i Z exp args = mkApp exp (map (mkLocal (getFC exp)) (reverse args))
6666
etaExpand i (S k) exp args
6767
= CLam (getFC exp) (MN "eta" i)
6868
(etaExpand (i + 1) k (weaken exp)
69-
(first :: map weakenVar args))
69+
(first :: map later args))
7070

7171
export
7272
expandToArity : Nat -> CExp vars -> List (CExp vars) -> CExp vars
@@ -229,7 +229,7 @@ mutual
229229
Just gdef <- lookupCtxtExact x (gamma defs)
230230
| Nothing => -- primitive type match
231231
do xn <- getFullName x
232-
pure $ MkConAlt xn TYCON Nothing args !(toCExpTree n sc)
232+
pure $ MkConAlt xn TYCON Nothing (cast args) !(toCExpTree n (rewrite sym $ fishAsSnocAppend vars args in sc))
233233
:: !(conCases n ns)
234234
case (definition gdef) of
235235
DCon _ arity (Just pos) => conCases n ns -- skip it
@@ -240,16 +240,16 @@ mutual
240240
sc' <- toCExpTree n sc
241241
ns' <- conCases n ns
242242
if dcon (definition gdef)
243-
then pure $ MkConAlt xn !(dconFlag xn) (Just tag) (toList args') (shrinkCExp subList sc') :: ns'
244-
else pure $ MkConAlt xn !(dconFlag xn) Nothing (toList args') (shrinkCExp subList sc') :: ns'
243+
then pure $ MkConAlt xn !(dconFlag xn) (Just tag) args' (shrinkCExp subList sc') :: ns'
244+
else pure $ MkConAlt xn !(dconFlag xn) Nothing args' (shrinkCExp subList sc') :: ns'
245245
where
246246
dcon : Def -> Bool
247247
dcon (DCon {}) = True
248248
dcon _ = False
249249

250-
subThinList : Thin (vars ++ args') (vars ++ ([<] <>< args)) -> Thin (vars <>< (args' <>> [])) (vars <>< args)
251-
subThinList t = do rewrite fishAsSnocAppend vars (toList args')
252-
rewrite castToList args'
250+
subThinList : Thin (vars ++ args') (vars ++ ([<] <>< args)) -> Thin (vars ++ args') (vars <>< args)
251+
subThinList t = do -- rewrite fishAsSnocAppend vars (toList args')
252+
-- rewrite castToList args'
253253
rewrite fishAsSnocAppend vars args
254254
t
255255

@@ -315,10 +315,9 @@ mutual
315315
:= rewrite sym $ fishAsSnocAppend vars args in sc'
316316

317317
let scope : CExp ((vars ++ [<MN "eff" 0]) ++ cast args)
318-
scope = rewrite sym $ appendAssociative vars [<MN "eff" 0] (cast args) in
319-
insertNames {outer=cast args}
320-
{inner=vars}
321-
{ns = [<MN "eff" 0]}
318+
scope = insertNames {inner=cast args}
319+
{outer=vars}
320+
{middle = [<MN "eff" 0]}
322321
(mkSizeOf _) (mkSizeOf _) sc''
323322
let tm = CLet fc (MN "eff" 0) NotInline scr (substs (cast s) env scope)
324323
log "compiler.newtype.world" 50 "Kept the scrutinee \{show tm}, scope: \{show scope}"
@@ -554,7 +553,7 @@ lamRHS ns tm
554553
tmExp = substs s env (rewrite appendLinLeftNeutral ns in tm)
555554
newArgs = getNewArgs env
556555
bounds = mkBounds newArgs
557-
expLocs = mkLocals zero {vars = Scope.empty} bounds tmExp in
556+
expLocs = mkLocals bounds zero {inner = Scope.empty} tmExp in
558557
lamBind (getFC tm) _ expLocs
559558
where
560559
lamBind : FC -> (ns : Scope) -> CExp ns -> ClosedCExp
@@ -586,7 +585,7 @@ toCDef n ty _ (ExternDef arity)
586585
-- TODO has quadratic runtime
587586
getVars : ArgList k ns -> List (Var ns)
588587
getVars Z = []
589-
getVars (S rest) = first :: map weakenVar (getVars rest)
588+
getVars (S rest) = first :: map later (getVars rest)
590589

591590
toCDef n ty _ (ForeignDef arity cs)
592591
= do defs <- get Ctxt
@@ -599,7 +598,7 @@ toCDef n ty _ (Builtin {arity} op)
599598
-- TODO has quadratic runtime
600599
getVars : ArgList k ns -> Vect k (Var ns)
601600
getVars Z = []
602-
getVars (S rest) = first :: map weakenVar (getVars rest)
601+
getVars (S rest) = first :: map later (getVars rest)
603602

604603
toCDef n _ _ (DCon tag arity pos)
605604
= do let nt = snd <$> pos

src/Compiler/ES/TailRec.idr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ module Compiler.ES.TailRec
118118

119119
import Data.List
120120
import Data.List1
121+
import Data.SnocList
121122
import Data.SortedSet
122123
import Data.SortedMap as M
123124
import Libraries.Data.Graph
@@ -249,7 +250,7 @@ tcDoneName gi = MN "TcDone" gi
249250
conAlt : TcGroup -> TcFunction -> NamedConAlt
250251
conAlt (MkTcGroup tcIx funs) (MkTcFunction n ix args exp) =
251252
let name = tcContinueName tcIx ix
252-
in MkNConAlt name DATACON (Just ix) args (toTc exp)
253+
in MkNConAlt name DATACON (Just ix) (cast args) (toTc exp)
253254

254255
where
255256
mutual

src/Compiler/ES/ToAst.idr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module Compiler.ES.ToAst
44

55
import Data.Vect
6+
import Data.SnocList
67
import Core.CompileExpr
78
import Core.Context
89
import Compiler.ES.Ast
@@ -223,7 +224,7 @@ mutual
223224
-- We map the list of args to the corresponding
224225
-- data projections (field accessors). They'll
225226
-- be then properly inlined when converting `x`.
226-
projections sc args
227+
projections sc (toList args)
227228
MkEConAlt (tag n tg) ci <$> stmt e x
228229

229230
-- a single branch in a pattern match on a constant

src/Compiler/Inline.idr

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ mutual
130130
usedCon : {free : _} ->
131131
{idx : Nat} -> (0 p : IsVar n idx free) -> CConAlt free -> Int
132132
usedCon n (MkConAlt _ _ _ args sc)
133-
= let MkVar n' = weakensN (mkSizeOf args) (MkVar n) in
133+
= let MkVar n' = weakenNs (mkSizeOf args) (MkVar n) in
134134
used n' sc
135135

136136
usedConst : {free : _} ->
@@ -292,20 +292,13 @@ mutual
292292

293293
extendLoc : {vars, free : _} ->
294294
{auto l : Ref LVar Int} ->
295-
FC -> EEnv free vars -> (args' : List Name) ->
296-
Core (Bounds (cast args'), EEnv free (Scope.ext vars args'))
297-
extendLoc fc env [] = pure (None, env)
298-
extendLoc fc env (n :: ns)
295+
FC -> EEnv free vars -> (args' : Scope) ->
296+
Core (Bounds args', EEnv free (Scope.addInner vars args'))
297+
extendLoc fc env [<] = pure (None, env)
298+
extendLoc fc env (ns :< n)
299299
= do xn <- genName "cv"
300-
let env' = env :< CRef fc xn
301-
(bs', env'') <- extendLoc fc env' ns
302-
303-
let
304-
bs'' : Bounds ([<n] <>< ns)
305-
bs'' = do
306-
rewrite snocAppendFishAssociative [<n] [<] ns
307-
cons n xn bs'
308-
pure (bs'', env'')
300+
(bs', env') <- extendLoc fc env ns
301+
pure (Add n xn bs', env' :< CRef fc xn)
309302

310303
evalAlt : {vars, free : _} ->
311304
{auto c : Ref Ctxt Defs} ->
@@ -314,9 +307,8 @@ mutual
314307
Core (CConAlt free)
315308
evalAlt {free} {vars} fc rec env stk (MkConAlt n ci t args sc)
316309
= do (bs, env') <- extendLoc fc env args
317-
scEval <- eval rec env' stk
318-
(rewrite sym $ snocAppendFishAssociative free vars args in sc)
319-
pure $ MkConAlt n ci t args (rewrite snocAppendFishAssociative free Scope.empty args in refsToLocals bs scEval)
310+
scEval <- eval rec env' stk (rewrite appendAssociative free vars args in sc)
311+
pure $ MkConAlt n ci t args (refsToLocals bs scEval)
320312

321313
evalConstAlt : {vars, free : _} ->
322314
{auto c : Ref Ctxt Defs} ->
@@ -336,14 +328,17 @@ mutual
336328
pickAlt rec env stk (CCon fc n ci t args) [] def
337329
= traverseOpt (eval rec env stk) def
338330
pickAlt {vars} {free} rec env stk con@(CCon fc n ci t args) (MkConAlt n' _ t' args' sc :: alts) def
339-
=
331+
= let args'' = toList args' in
340332
if matches n t n' t'
341-
then case checkLengthMatch args' args of
333+
then case checkLengthMatch (toList args') args of
342334
Nothing => pure Nothing
343335
Just m =>
344-
do let env' = extend env args' args m
336+
do let env' = extend env (toList args') args m
345337
pure $ Just !(eval rec env' stk
346-
(rewrite sym $ snocAppendFishAssociative free vars args' in sc))
338+
(do rewrite sym $ snocAppendFishAssociative free vars (toList args')
339+
rewrite sym $ snocAppendAsFish (free ++ vars) args'
340+
sc
341+
))
347342
else pickAlt rec env stk con alts def
348343
where
349344
matches : Name -> Maybe Int -> Name -> Maybe Int -> Bool

0 commit comments

Comments
 (0)