Skip to content

Commit edbdf25

Browse files
committed
fix
1 parent 21f8484 commit edbdf25

File tree

17 files changed

+80
-133
lines changed

17 files changed

+80
-133
lines changed

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: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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 Libraries.Data.Graph
122123
import Libraries.Data.SortedSet
123124
import Libraries.Data.List.Extra as L
@@ -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

src/Compiler/Opts/CSE.idr

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ dropVar : SizeOf inner
127127
-> (0 p : IsVar x n (Scope.addInner outer inner))
128128
-> Maybe (Erased (IsVar x n inner))
129129
dropVar inn p = case locateIsVar inn p of
130-
Left p => Just p
131-
Right p => Nothing
130+
Right p => Just p
131+
Left p => Nothing
132132

133133

134134
-- Tries to 'strengthen' an expression by removing an `outer` context.
@@ -174,15 +174,9 @@ mutual
174174
dropConAlt : Drop CConAlt
175175
dropConAlt inn (MkConAlt x y tag args z) =
176176
MkConAlt x y tag args <$>
177-
rewrite fishAsSnocAppend inner args in
178177
dropCExp
179-
(inn + mkSizeOf (cast args))
180-
(replace {p = CExp} rule z)
181-
where
182-
rule : (outer ++ inner) <>< args = outer ++ (inner ++ (cast args))
183-
rule = do rewrite appendAssociative outer inner (cast args)
184-
rewrite fishAsSnocAppend (outer ++ inner) args
185-
Builtin.Refl
178+
(inn + mkSizeOf args)
179+
(replace {p = CExp} (sym $ appendAssociative outer inner args) z)
186180

187181
dropConstAlt : Drop CConstAlt
188182
dropConstAlt inn (MkConstAlt x y) = MkConstAlt x <$> dropCExp inn y

src/Compiler/Opts/ConstantFold.idr

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,6 @@ wk sout (Wk {ws, ds, vars} rho sws)
5757
Wk rho (sws + sout)
5858
wk ws rho = Wk rho ws
5959

60-
wksN : Subst ds vars -> SizeOf out -> Subst (Scope.ext ds out) (Scope.ext vars out)
61-
wksN s s'
62-
= rewrite fishAsSnocAppend ds out in
63-
rewrite fishAsSnocAppend vars out in
64-
wk (zero <>< s') s
65-
6660
record WkCExp (vars : Scope) where
6761
constructor MkWkCExp
6862
{0 outer, supp : Scope}
@@ -72,7 +66,7 @@ record WkCExp (vars : Scope) where
7266

7367
Weaken WkCExp where
7468
weakenNs s' (MkWkCExp {supp, outer} s Refl e)
75-
= MkWkCExp (s + s') (sym $ appendAssociative supp outer ns) e
69+
= MkWkCExp (s + s') (sym $ appendAssociative supp outer inner) e
7670

7771
lookup : FC -> Var ds -> Subst ds vars -> CExp vars
7872
lookup fc (MkVar p) rho = case go p rho of
@@ -178,7 +172,7 @@ constFold rho (CConCase fc sc xs x)
178172
where
179173
foldAlt : CConAlt vars -> CConAlt vars'
180174
foldAlt (MkConAlt n ci t xs e)
181-
= MkConAlt n ci t xs $ constFold (wksN rho (mkSizeOf xs)) e
175+
= MkConAlt n ci t xs $ constFold (wk (mkSizeOf xs) rho) e
182176

183177
constFold rho (CConstCase fc sc xs x) =
184178
let sc' = constFold rho sc

src/Compiler/Opts/Identity.idr

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ makeArgs args = makeArgs' args id
1717
makeArgs' [<] f = []
1818
makeArgs' (xs :< x) f = f first :: makeArgs' xs (f . weaken)
1919

20-
makeArgz : (args : List Name) -> List (Var (Scope.ext vars args))
21-
makeArgz args
22-
= embedFishily @{ListFreelyEmbeddable}
23-
$ reverse $ Var.allVars ([<] <>< args)
24-
2520
parameters (fn1 : Name) (idIdx : Nat)
2621
mutual
2722
-- special case for matching on 'Nat'-shaped things
@@ -94,8 +89,8 @@ parameters (fn1 : Name) (idIdx : Nat)
9489
altEq : CConAlt vars -> Bool
9590
altEq (MkConAlt y _ _ args exp) =
9691
cexpIdentity
97-
(weakensN (mkSizeOf args) var)
98-
(Just (y, makeArgz args))
92+
(weakenNs (mkSizeOf args) var)
93+
(Just (y, makeArgs args))
9994
const
10095
exp
10196
cexpIdentity var con const (CConstCase fc sc xs x) =

src/Compiler/Scheme/Common.idr

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Core.TT
1414

1515
import Libraries.Data.SortedSet
1616
import Libraries.Data.String.Builder
17+
import Data.SnocList
1718

1819
import Data.Vect
1920

@@ -358,11 +359,11 @@ parameters (constants : SortedSet Name)
358359
schConAlt : Nat -> Builder -> NamedConAlt -> Core Builder
359360
schConAlt i target (MkNConAlt n ci tag args sc)
360361
= pure $ "((" ++ showTag n tag ++ ") "
361-
++ bindArgs target sc 1 args !(schExp i sc) ++ ")"
362+
++ bindArgs target sc 1 (toList args) !(schExp i sc) ++ ")"
362363

363364
schConUncheckedAlt : Nat -> Builder -> NamedConAlt -> Core Builder
364365
schConUncheckedAlt i target (MkNConAlt n ci tag args sc)
365-
= pure $ bindArgs target sc 1 args !(schExp i sc)
366+
= pure $ bindArgs target sc 1 (toList args) !(schExp i sc)
366367

367368
schConstAlt : Nat -> Builder -> NamedConstAlt -> Core Builder
368369
schConstAlt i target (MkNConstAlt c exp)
@@ -435,7 +436,7 @@ parameters (constants : SortedSet Name)
435436
where
436437
getAltCode : Builder -> NamedConAlt -> Core Builder
437438
getAltCode n (MkNConAlt _ _ _ args sc)
438-
= pure $ bindArgs n sc 0 args !(schExp i sc)
439+
= pure $ bindArgs n sc 0 (toList args) !(schExp i sc)
439440
schRecordCase _ _ _ _ = throw $ InternalError "Case of a record has multiple alternatives"
440441

441442
schListCase : Nat -> NamedCExp -> List NamedConAlt -> Maybe NamedCExp ->
@@ -475,7 +476,7 @@ parameters (constants : SortedSet Name)
475476

476477
getConsCode : Builder -> List NamedConAlt -> Core (Maybe Builder)
477478
getConsCode n [] = pure Nothing
478-
getConsCode n (MkNConAlt _ CONS _ [x,xs] sc :: _)
479+
getConsCode n (MkNConAlt _ CONS _ [<x,xs] sc :: _)
479480
= do sc' <- schExp (i + 1) sc
480481
pure $ Just $ bindArgs [(x, "car"), (xs, "cdr")] sc'
481482
where
@@ -525,7 +526,7 @@ parameters (constants : SortedSet Name)
525526

526527
getJustCode : Builder -> List NamedConAlt -> Core (Maybe Builder)
527528
getJustCode n [] = pure Nothing
528-
getJustCode n (MkNConAlt _ JUST _ [x] sc :: _)
529+
getJustCode n (MkNConAlt _ JUST _ [<x] sc :: _)
529530
= do sc' <- schExp (i + 1) sc
530531
pure $ Just $ bindArg x sc'
531532
where

src/Core/Case/CaseBuilder.idr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,7 +1201,7 @@ mkPatClause fc fn args s ty pid (ps, rhs)
12011201
:= case as of
12021202
[] => (Unknown, [])
12031203
(a :: as) => (embed a, as)
1204-
let info = MkInfo {name=r} p (fishyIsVar {outer=[<]} h) ty
1204+
let info = MkInfo {name=r} p (isVarFishily {outer=[<]} h) ty
12051205
rest <- mkNames args ps eq h as
12061206
pure (info :: rewrite fishAsSnocAppend [<r] args in embed rest)
12071207

0 commit comments

Comments
 (0)