Skip to content

Commit b4a24d6

Browse files
authored
Add standalone resymbolization pass (#962)
* Add resymolize as standalone pass * Add tests for resymbolization
1 parent 3a7eeab commit b4a24d6

File tree

2 files changed

+278
-124
lines changed

2 files changed

+278
-124
lines changed

src/stdlib/mexpr/monomorphize.mc

Lines changed: 2 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ include "mexpr/cmp.mc"
1717
include "mexpr/eq.mc"
1818
include "mexpr/eval.mc"
1919
include "mexpr/pprint.mc"
20+
include "mexpr/resymbolize.mc"
2021
include "mexpr/symbolize.mc"
2122
include "mexpr/type.mc"
2223
include "mexpr/type-check.mc"
@@ -207,129 +208,6 @@ lang MonomorphizeInstantiate = Monomorphize
207208
| ty -> smap_Type_Type (instantiatePolymorphicType inst) ty
208209
end
209210

210-
lang MonomorphizeResymbolize = Monomorphize
211-
-- Resymbolizes all variables bound inside the provided expression. We use
212-
-- this to ensure function definitions duplicated due to monomorphization end
213-
-- up with distinct symbols.
214-
sem resymbolizeBindings : Expr -> Expr
215-
sem resymbolizeBindings =
216-
| ast -> resymbolizeBindingsExpr (mapEmpty nameCmp) ast
217-
218-
sem resymbolizeBindingsDecl : Map Name Name -> Decl -> (Map Name Name, Decl)
219-
sem resymbolizeBindingsDecl nameMap =
220-
| d -> (nameMap, smap_Decl_Expr (resymbolizeBindingsExpr nameMap) d)
221-
| DeclLet t ->
222-
let body = resymbolizeBindingsExpr nameMap t.body in
223-
let newId = nameSetNewSym t.ident in
224-
let nameMap = mapInsert t.ident newId nameMap in
225-
( nameMap
226-
, DeclLet
227-
{ t with ident = newId
228-
, tyAnnot = resymbolizeBindingsType nameMap t.tyAnnot
229-
, tyBody = resymbolizeBindingsType nameMap t.tyBody
230-
, body = body
231-
}
232-
)
233-
| DeclRecLets t ->
234-
let addNewIdBinding = lam nameMap. lam bind.
235-
let newId = nameSetNewSym bind.ident in
236-
(mapInsert bind.ident newId nameMap, {bind with ident = newId})
237-
in
238-
match mapAccumL addNewIdBinding nameMap t.bindings with (nameMap, bindings) in
239-
let resymbolizeBind = lam bind.
240-
{bind with tyAnnot = resymbolizeBindingsType nameMap bind.tyAnnot,
241-
tyBody = resymbolizeBindingsType nameMap bind.tyBody,
242-
body = resymbolizeBindingsExpr nameMap bind.body}
243-
in
244-
let bindings = map resymbolizeBind bindings in
245-
(nameMap, DeclRecLets {t with bindings = bindings})
246-
| DeclType t ->
247-
let newId = nameSetNewSym t.ident in
248-
let nameMap = mapInsert t.ident newId nameMap in
249-
( nameMap
250-
, DeclType
251-
{ t with ident = newId
252-
, tyIdent = resymbolizeBindingsType nameMap t.tyIdent
253-
}
254-
)
255-
| DeclConDef t ->
256-
let newId = nameSetNewSym t.ident in
257-
let nameMap = mapInsert t.ident newId nameMap in
258-
(nameMap, DeclConDef {t with ident = newId, tyIdent = resymbolizeBindingsType nameMap t.tyIdent})
259-
260-
sem resymbolizeBindingsExpr : Map Name Name -> Expr -> Expr
261-
sem resymbolizeBindingsExpr nameMap =
262-
| TmVar t ->
263-
let newId =
264-
match mapLookup t.ident nameMap with Some newId then newId
265-
else t.ident
266-
in
267-
TmVar {t with ident = newId, ty = resymbolizeBindingsType nameMap t.ty}
268-
| TmLam t ->
269-
let newId = nameSetNewSym t.ident in
270-
let nameMap = mapInsert t.ident newId nameMap in
271-
TmLam {t with ident = newId,
272-
tyAnnot = resymbolizeBindingsType nameMap t.tyAnnot,
273-
tyParam = resymbolizeBindingsType nameMap t.tyParam,
274-
body = resymbolizeBindingsExpr nameMap t.body,
275-
ty = resymbolizeBindingsType nameMap t.ty}
276-
| TmDecl t ->
277-
match resymbolizeBindingsDecl nameMap t.decl with (nameMap, decl) in
278-
let inexpr = resymbolizeBindingsExpr nameMap t.inexpr in
279-
TmDecl {t with decl = decl, inexpr = inexpr}
280-
| TmConApp t ->
281-
let newId =
282-
match mapLookup t.ident nameMap with Some newId then newId
283-
else t.ident
284-
in
285-
TmConApp {t with ident = newId,
286-
body = resymbolizeBindingsExpr nameMap t.body,
287-
ty = resymbolizeBindingsType nameMap t.ty}
288-
| TmMatch t ->
289-
let target = resymbolizeBindingsExpr nameMap t.target in
290-
match resymbolizeBindingsPat nameMap t.pat with (thnNameMap, pat) in
291-
TmMatch {t with target = target, pat = pat,
292-
thn = resymbolizeBindingsExpr thnNameMap t.thn,
293-
els = resymbolizeBindingsExpr nameMap t.els,
294-
ty = resymbolizeBindingsType nameMap t.ty}
295-
| t ->
296-
let t = smap_Expr_Expr (resymbolizeBindingsExpr nameMap) t in
297-
let t = smap_Expr_Type (resymbolizeBindingsType nameMap) t in
298-
let t = smap_Expr_TypeLabel (resymbolizeBindingsType nameMap) t in
299-
withType (resymbolizeBindingsType nameMap (tyTm t)) t
300-
301-
sem resymbolizeBindingsPat : Map Name Name -> Pat -> (Map Name Name, Pat)
302-
sem resymbolizeBindingsPat nameMap =
303-
| PatNamed (t & {ident = PName id}) ->
304-
let newId = nameSetNewSym id in
305-
(mapInsert id newId nameMap, PatNamed {t with ident = PName newId})
306-
| PatSeqEdge (t & {middle = PName id}) ->
307-
let newId = nameSetNewSym id in
308-
(mapInsert id newId nameMap, PatSeqEdge {t with middle = PName newId})
309-
| PatCon t ->
310-
match mapLookup t.ident nameMap with Some newId then
311-
(nameMap, PatCon {t with ident = newId})
312-
else (nameMap, PatCon t)
313-
| p -> smapAccumL_Pat_Pat resymbolizeBindingsPat nameMap p
314-
315-
sem resymbolizeBindingsType : Map Name Name -> Type -> Type
316-
sem resymbolizeBindingsType nameMap =
317-
| TyCon t ->
318-
match mapLookup t.ident nameMap with Some newId then
319-
TyCon {t with ident = newId}
320-
else TyCon t
321-
| TyVar t ->
322-
match mapLookup t.ident nameMap with Some newId then
323-
TyVar {t with ident = newId}
324-
else TyVar t
325-
| TyAll t ->
326-
let newId = nameSetNewSym t.ident in
327-
let nameMap = mapInsert t.ident newId nameMap in
328-
TyAll {t with ident = newId,
329-
ty = resymbolizeBindingsType nameMap t.ty}
330-
| ty -> smap_Type_Type (resymbolizeBindingsType nameMap) ty
331-
end
332-
333211
lang MonomorphizeCollect =
334212
MonomorphizeValidate + MonomorphizeInstantiate + MExprCallGraph + AppTypeUtils
335213

@@ -618,7 +496,7 @@ lang MonomorphizeCollect =
618496
| ty -> monoError [infoTy ty] "Constructor type does not refer to a known variant type"
619497
end
620498

621-
lang MonomorphizeApply = MonomorphizeInstantiate + MonomorphizeResymbolize + AppTypeUtils
499+
lang MonomorphizeApply = MonomorphizeInstantiate + MExprResymbolize + AppTypeUtils
622500
-- Replaces polymorphic constructs with their monomorphic bindings
623501
-- based on the provided monomorphization environment (bottom-up).
624502
sem applyMonomorphization : MonoEnv -> Expr -> Expr

0 commit comments

Comments
 (0)