Safe Haskell | None |
---|
Simple code motion transformation performing common sub-expression elimination and variable hoisting. Note that the implementation is very inefficient.
The code is based on an implementation by Gergely Dévai.
- data BindDict dom = BindDict {
- prjVariable :: forall a. dom a -> Maybe VarId
- prjLambda :: forall a. dom a -> Maybe VarId
- injVariable :: forall a. ASTF dom a -> VarId -> dom (Full a)
- injLambda :: forall a b. ASTF dom a -> ASTF dom b -> VarId -> dom (b :-> Full (a -> b))
- injLet :: forall a b. ASTF dom b -> dom (a :-> ((a -> b) :-> Full b))
- codeMotion :: forall dom a. (ConstrainedBy dom Typeable, AlphaEq dom dom dom [(VarId, VarId)]) => BindDict dom -> (forall a. dom a -> Bool) -> ASTF dom a -> State VarId (ASTF dom a)
- defaultBindDict :: (Variable :<: dom, Lambda :<: dom, Let :<: dom, Constrained dom) => BindDict (dom :|| Typeable)
- reifySmart :: (AlphaEq dom dom ((Lambda :+: (Variable :+: dom)) :|| Typeable) [(VarId, VarId)], Syntactic a (HODomain dom Typeable)) => BindDict ((Lambda :+: (Variable :+: dom)) :|| Typeable) -> (forall a. ((Lambda :+: (Variable :+: dom)) :|| Typeable) a -> Bool) -> a -> ASTF ((Lambda :+: (Variable :+: dom)) :|| Typeable) (Internal a)
- reifySmartDefault :: (Let :<: dom, AlphaEq dom dom ((Lambda :+: (Variable :+: dom)) :|| Typeable) [(VarId, VarId)], Syntactic a (HODomain dom Typeable)) => (forall a. ((Lambda :+: (Variable :+: dom)) :|| Typeable) a -> Bool) -> a -> ASTF ((Lambda :+: (Variable :+: dom)) :|| Typeable) (Internal a)
Documentation
Interface for binding constructs
BindDict | |
|
codeMotion :: forall dom a. (ConstrainedBy dom Typeable, AlphaEq dom dom dom [(VarId, VarId)]) => BindDict dom -> (forall a. dom a -> Bool) -> ASTF dom a -> State VarId (ASTF dom a)Source
Perform common sub-expression elimination and variable hoisting
defaultBindDict :: (Variable :<: dom, Lambda :<: dom, Let :<: dom, Constrained dom) => BindDict (dom :|| Typeable)Source
reifySmart :: (AlphaEq dom dom ((Lambda :+: (Variable :+: dom)) :|| Typeable) [(VarId, VarId)], Syntactic a (HODomain dom Typeable)) => BindDict ((Lambda :+: (Variable :+: dom)) :|| Typeable) -> (forall a. ((Lambda :+: (Variable :+: dom)) :|| Typeable) a -> Bool) -> a -> ASTF ((Lambda :+: (Variable :+: dom)) :|| Typeable) (Internal a)Source
Like reify
but with common sub-expression elimination and variable
hoisting
reifySmartDefault :: (Let :<: dom, AlphaEq dom dom ((Lambda :+: (Variable :+: dom)) :|| Typeable) [(VarId, VarId)], Syntactic a (HODomain dom Typeable)) => (forall a. ((Lambda :+: (Variable :+: dom)) :|| Typeable) a -> Bool) -> a -> ASTF ((Lambda :+: (Variable :+: dom)) :|| Typeable) (Internal a)Source