Skip to content

Commit d13ee9c

Browse files
committed
Use toBindersAbs to handle hoisting.
1 parent 336bb04 commit d13ee9c

File tree

4 files changed

+20
-35
lines changed

4 files changed

+20
-35
lines changed

src/lib/Builder.hs

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -626,31 +626,14 @@ buildAbs hint binding cont = do
626626
return $ Abs b body
627627
{-# INLINE buildAbs #-}
628628

629-
varsAsBinderNest :: (EnvReader m, IRRep r) => [AtomVar r n] -> m n (EmptyAbs (Nest (Binder r)) n)
630-
varsAsBinderNest [] = return $ EmptyAbs Empty
631-
varsAsBinderNest (v:vs) = do
632-
rest <- varsAsBinderNest vs
633-
ty <- return $ getType v
634-
let AtomVar v' _ = v
635-
Abs b (Abs bs UnitE) <- return $ abstractFreeVar v' rest
636-
return $ EmptyAbs (Nest (b:>ty) bs)
637-
638629
typesFromNonDepBinderNest
639630
:: (EnvReader m, Fallible1 m, IRRep r)
640631
=> Nest (Binder r) n l -> m n [Type r n]
641632
typesFromNonDepBinderNest Empty = return []
642-
typesFromNonDepBinderNest (Nest (b:>ty) rest) = do
643-
Abs rest' UnitE <- return $ ignoreHoistFailure $ hoist b (Abs rest UnitE)
633+
typesFromNonDepBinderNest (Nest b rest) = do
634+
Abs rest' UnitE <- return $ assumeConst $ Abs (UnaryNest b) $ Abs rest UnitE
644635
tys <- typesFromNonDepBinderNest rest'
645-
return $ ty : tys
646-
647-
singletonBinderNest
648-
:: (EnvReader m, IRRep r)
649-
=> NameHint -> ann n
650-
-> m n (EmptyAbs (Nest (BinderP (AtomNameC r) ann)) n)
651-
singletonBinderNest hint ann = do
652-
Abs b _ <- return $ newName hint
653-
return $ EmptyAbs (Nest (b:>ann) Empty)
636+
return $ binderType b : tys
654637

655638
buildUnaryLamExpr
656639
:: (ScopableBuilder r m)
@@ -1260,10 +1243,10 @@ isJustE x = liftEmitBuilder $
12601243
-- Monoid a -> (n=>a) -> a
12611244
reduceE :: (Emits n, Builder r m) => BaseMonoid r n -> Atom r n -> m n (Atom r n)
12621245
reduceE monoid xs = liftEmitBuilder do
1263-
TabTy d (n:>ty) a <- return $ getType xs
1264-
a' <- return $ ignoreHoistFailure $ hoist n a
1265-
getSnd =<< emitRunWriter noHint a' monoid \_ ref ->
1266-
buildFor noHint Fwd (sink $ IxType ty d) \i -> do
1246+
TabPi tabPi <- return $ getType xs
1247+
let a = assumeConst tabPi
1248+
getSnd =<< emitRunWriter noHint a monoid \_ ref ->
1249+
buildFor noHint Fwd (sink $ tabIxType tabPi) \i -> do
12671250
x <- tabApp (sink xs) (Var i)
12681251
emitExpr $ PrimOp $ RefOp (sink $ Var ref) $ MExtend (sink monoid) x
12691252

@@ -1276,11 +1259,10 @@ andMonoid = liftM (BaseMonoid TrueAtom) $ liftBuilder $
12761259
mapE :: (Emits n, ScopableBuilder r m)
12771260
=> (forall l. (Emits l, DExt n l) => Atom r l -> m l (Atom r l))
12781261
-> Atom r n -> m n (Atom r n)
1279-
mapE f xs = do
1280-
TabTy d (n:>ty) _ <- return $ getType xs
1281-
buildFor (getNameHint n) Fwd (IxType ty d) \i -> do
1282-
x <- tabApp (sink xs) (Var i)
1283-
f x
1262+
mapE cont xs = do
1263+
TabPi tabPi <- return $ getType xs
1264+
buildFor (getNameHint tabPi) Fwd (tabIxType tabPi) \i -> do
1265+
tabApp (sink xs) (Var i) >>= cont
12841266

12851267
-- (n:Type) ?-> (a:Type) ?-> (xs : n=>Maybe a) : Maybe (n => a) =
12861268
catMaybesE :: (Emits n, Builder r m) => Atom r n -> m n (Atom r n)

src/lib/CheapReduction.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module CheapReduction
1616
, liftSimpFun, makeStructRepVal, NonAtomRenamer (..), Visitor (..), VisitGeneric (..)
1717
, visitAtomPartial, visitTypePartial, visitAtomDefault, visitTypeDefault, Visitor2
1818
, visitBinders, visitPiDefault, visitAlt, toAtomVar, instantiate, withInstantiated
19-
, bindersToVars, bindersToAtoms, instantiateNames, withInstantiatedNames)
19+
, bindersToVars, bindersToAtoms, instantiateNames, withInstantiatedNames, assumeConst)
2020
where
2121

2222
import Control.Applicative
@@ -467,6 +467,10 @@ instantiateTyConDef (TyConDef _ _ bs conDefs) (TyConParams _ xs) = do
467467
applySubst (bs @@> (SubstVal <$> xs)) conDefs
468468
{-# INLINE instantiateTyConDef #-}
469469

470+
assumeConst
471+
:: (IRRep r, HoistableE body, SinkableE body, ToBindersAbs e body r) => e n -> body n
472+
assumeConst e = case toAbs e of Abs bs body -> ignoreHoistFailure $ hoist bs body
473+
470474
instantiate
471475
:: (EnvReader m, IRRep r, SubstE (SubstVal Atom) body, SinkableE body, ToBindersAbs e body r)
472476
=> e n -> [Atom r n] -> m n (body n)

src/lib/QueryType.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,9 @@ typeOfTopApp f xs = do
112112

113113
typeOfIndexRef :: (EnvReader m, Fallible1 m, IRRep r) => Type r n -> Atom r n -> m n (Type r n)
114114
typeOfIndexRef (TC (RefType h s)) i = do
115-
TabTy _ (b:>_) eltTy <- return s
116-
eltTy' <- applyAbs (Abs b eltTy) (SubstVal i)
117-
return $ TC $ RefType h eltTy'
115+
TabPi tabPi <- return s
116+
eltTy <- instantiate tabPi [i]
117+
return $ TC $ RefType h eltTy
118118
typeOfIndexRef _ _ = error "expected a ref type"
119119

120120
typeOfProjRef :: EnvReader m => Type r n -> Projection -> m n (Type r n)

src/lib/TopLevel.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,8 +555,7 @@ evalBlock typed = do
555555
llvmOpt <- packageLLVMCallable impOpt
556556
resultVals <- liftIO $ callEntryFun llvmOpt []
557557
TopLam _ destTy _ <- return lOpt
558-
PiType bs (EffTy _ resultTy') <- return $ piTypeWithoutDest destTy
559-
let resultTy = ignoreHoistFailure $ hoist bs resultTy'
558+
EffTy _ resultTy <- return $ assumeConst $ piTypeWithoutDest destTy
560559
repValAtom =<< repValFromFlatList resultTy resultVals
561560
applyReconTop recon simpResult
562561
{-# SCC evalBlock #-}

0 commit comments

Comments
 (0)