{-# LANGUAGE FlexibleContexts #-}

module Futhark.Pass.Simplify
  ( simplify,
    simplifySOACS,
    simplifySeq,
    simplifyMC,
    simplifyGPU,
    simplifyGPUMem,
    simplifySeqMem,
    simplifyMCMem,
  )
where

import qualified Futhark.IR.GPU.Simplify as GPU
import qualified Futhark.IR.GPUMem as GPUMem
import qualified Futhark.IR.MC as MC
import qualified Futhark.IR.MCMem as MCMem
import qualified Futhark.IR.SOACS.Simplify as SOACS
import qualified Futhark.IR.Seq as Seq
import qualified Futhark.IR.SeqMem as SeqMem
import Futhark.IR.Syntax
import Futhark.Pass

simplify ::
  (Prog rep -> PassM (Prog rep)) ->
  Pass rep rep
simplify :: (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify = String -> String -> (Prog rep -> PassM (Prog rep)) -> Pass rep rep
forall fromrep torep.
String
-> String
-> (Prog fromrep -> PassM (Prog torep))
-> Pass fromrep torep
Pass String
"simplify" String
"Perform simple enabling optimisations."

simplifySOACS :: Pass SOACS.SOACS SOACS.SOACS
simplifySOACS :: Pass SOACS SOACS
simplifySOACS = (Prog SOACS -> PassM (Prog SOACS)) -> Pass SOACS SOACS
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog SOACS -> PassM (Prog SOACS)
SOACS.simplifySOACS

simplifyGPU :: Pass GPU.GPU GPU.GPU
simplifyGPU :: Pass GPU GPU
simplifyGPU = (Prog GPU -> PassM (Prog GPU)) -> Pass GPU GPU
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog GPU -> PassM (Prog GPU)
GPU.simplifyGPU

simplifySeq :: Pass Seq.Seq Seq.Seq
simplifySeq :: Pass Seq Seq
simplifySeq = (Prog Seq -> PassM (Prog Seq)) -> Pass Seq Seq
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog Seq -> PassM (Prog Seq)
Seq.simplifyProg

simplifyMC :: Pass MC.MC MC.MC
simplifyMC :: Pass MC MC
simplifyMC = (Prog MC -> PassM (Prog MC)) -> Pass MC MC
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog MC -> PassM (Prog MC)
MC.simplifyProg

simplifyGPUMem :: Pass GPUMem.GPUMem GPUMem.GPUMem
simplifyGPUMem :: Pass GPUMem GPUMem
simplifyGPUMem = (Prog GPUMem -> PassM (Prog GPUMem)) -> Pass GPUMem GPUMem
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog GPUMem -> PassM (Prog GPUMem)
GPUMem.simplifyProg

simplifySeqMem :: Pass SeqMem.SeqMem SeqMem.SeqMem
simplifySeqMem :: Pass SeqMem SeqMem
simplifySeqMem = (Prog SeqMem -> PassM (Prog SeqMem)) -> Pass SeqMem SeqMem
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog SeqMem -> PassM (Prog SeqMem)
SeqMem.simplifyProg

simplifyMCMem :: Pass MCMem.MCMem MCMem.MCMem
simplifyMCMem :: Pass MCMem MCMem
simplifyMCMem = (Prog MCMem -> PassM (Prog MCMem)) -> Pass MCMem MCMem
forall rep. (Prog rep -> PassM (Prog rep)) -> Pass rep rep
simplify Prog MCMem -> PassM (Prog MCMem)
MCMem.simplifyProg