module Futhark.Internalise (internaliseProg) where
import Data.Text qualified as T
import Futhark.Compiler.Config
import Futhark.IR.SOACS as I hiding (stmPat)
import Futhark.Internalise.ApplyTypeAbbrs as ApplyTypeAbbrs
import Futhark.Internalise.Defunctionalise as Defunctionalise
import Futhark.Internalise.Defunctorise as Defunctorise
import Futhark.Internalise.Entry (visibleTypes)
import Futhark.Internalise.Exps qualified as Exps
import Futhark.Internalise.FullNormalise qualified as FullNormalise
import Futhark.Internalise.LiftLambdas as LiftLambdas
import Futhark.Internalise.Monad as I
import Futhark.Internalise.Monomorphise as Monomorphise
import Futhark.Internalise.ReplaceRecords as ReplaceRecords
import Futhark.Util.Log
import Language.Futhark.Semantic (Imports)
internaliseProg ::
(MonadFreshNames m, MonadLogger m) =>
FutharkConfig ->
Imports ->
m (I.Prog SOACS)
internaliseProg :: forall (m :: * -> *).
(MonadFreshNames m, MonadLogger m) =>
FutharkConfig -> Imports -> m (Prog SOACS)
internaliseProg FutharkConfig
config Imports
prog = do
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Defunctorising"
[ValBind]
prog_decs0 <- [Dec] -> m [ValBind]
forall (m :: * -> *). Monad m => [Dec] -> m [ValBind]
ApplyTypeAbbrs.transformProg ([Dec] -> m [ValBind]) -> m [Dec] -> m [ValBind]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Imports -> m [Dec]
forall (m :: * -> *). MonadFreshNames m => Imports -> m [Dec]
Defunctorise.transformProg Imports
prog
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Full Normalising"
[ValBind]
prog_decs1 <- [ValBind] -> m [ValBind]
forall (m :: * -> *). MonadFreshNames m => [ValBind] -> m [ValBind]
FullNormalise.transformProg [ValBind]
prog_decs0
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Replacing records"
[ValBind]
prog_decs2 <- [ValBind] -> m [ValBind]
forall (m :: * -> *). MonadFreshNames m => [ValBind] -> m [ValBind]
ReplaceRecords.transformProg [ValBind]
prog_decs1
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Lifting lambdas"
[ValBind]
prog_decs3 <- [ValBind] -> m [ValBind]
forall (m :: * -> *). MonadFreshNames m => [ValBind] -> m [ValBind]
LiftLambdas.transformProg [ValBind]
prog_decs2
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Monomorphising"
[ValBind]
prog_decs4 <- [ValBind] -> m [ValBind]
forall (m :: * -> *). MonadFreshNames m => [ValBind] -> m [ValBind]
Monomorphise.transformProg [ValBind]
prog_decs3
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Defunctionalising"
[ValBind]
prog_decs5 <- [ValBind] -> m [ValBind]
forall (m :: * -> *). MonadFreshNames m => [ValBind] -> m [ValBind]
Defunctionalise.transformProg [ValBind]
prog_decs4
Text -> m ()
forall {m :: * -> *}. MonadLogger m => Text -> m ()
maybeLog Text
"Converting to core IR"
Bool -> VisibleTypes -> [ValBind] -> m (Prog SOACS)
forall (m :: * -> *).
MonadFreshNames m =>
Bool -> VisibleTypes -> [ValBind] -> m (Prog SOACS)
Exps.transformProg (FutharkConfig -> Bool
futharkSafe FutharkConfig
config) (Imports -> VisibleTypes
visibleTypes Imports
prog) [ValBind]
prog_decs5
where
verbose :: Bool
verbose = (Verbosity, Maybe FilePath) -> Verbosity
forall a b. (a, b) -> a
fst (FutharkConfig -> (Verbosity, Maybe FilePath)
futharkVerbose FutharkConfig
config) Verbosity -> Verbosity -> Bool
forall a. Ord a => a -> a -> Bool
> Verbosity
NotVerbose
maybeLog :: Text -> m ()
maybeLog Text
s
| Bool
verbose = Text -> m ()
forall a. ToLog a => a -> m ()
forall (m :: * -> *) a. (MonadLogger m, ToLog a) => a -> m ()
logMsg (Text
s :: T.Text)
| Bool
otherwise = () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()