{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
module Futhark.Optimise.MemoryBlockMerging.Coalescing.Exps
( Exp'(..)
, findExpsFunDef
) where
import qualified Data.Map.Strict as M
import Control.Monad
import Control.Monad.Writer
import Futhark.Representation.AST
import Futhark.Representation.ExplicitMemory (ExplicitMemorish)
import Futhark.Representation.Kernels.Kernel
import Futhark.Optimise.MemoryBlockMerging.Miscellaneous
data Exp' = forall lore. Annotations lore => Exp Int Int (Exp lore)
instance Show Exp' where
show (Exp _nctxpatters _nthvalpattern e) = show e
type Exps = M.Map VName Exp'
newtype FindM lore a = FindM { unFindM :: Writer Exps a }
deriving (Monad, Functor, Applicative,
MonadWriter Exps)
type LoreConstraints lore = (ExplicitMemorish lore,
FullWalk lore)
coerce :: FindM flore a -> FindM tlore a
coerce = FindM . unFindM
findExpsFunDef :: LoreConstraints lore =>
FunDef lore -> Exps
findExpsFunDef fundef =
let m = unFindM $ lookInBody $ funDefBody fundef
res = execWriter m
in res
lookInBody :: LoreConstraints lore =>
Body lore -> FindM lore ()
lookInBody (Body _ bnds _res) =
mapM_ lookInStm bnds
lookInKernelBody :: LoreConstraints lore =>
KernelBody lore -> FindM lore ()
lookInKernelBody (KernelBody _ bnds _res) =
mapM_ lookInStm bnds
lookInStm :: LoreConstraints lore =>
Stm lore -> FindM lore ()
lookInStm (Let (Pattern patctxelems patvalelems) _ e) = do
forM_ (zip patvalelems [0..]) $ \(PatElem var _, i) ->
tell $ M.singleton var $ Exp (length patctxelems) i e
fullWalkExpM walker walker_kernel e
where walker = identityWalker
{ walkOnBody = lookInBody }
walker_kernel = identityKernelWalker
{ walkOnKernelBody = coerce . lookInBody
, walkOnKernelKernelBody = coerce . lookInKernelBody
}