{-# LANGUAGE FlexibleContexts #-}

module Futhark.Pass.Simplify
  ( simplify,
    simplifySOACS,
    simplifySeq,
    simplifyKernels,
    simplifyKernelsMem,
    simplifySeqMem,
  )
where

import qualified Futhark.IR.Kernels.Simplify as Kernels
import qualified Futhark.IR.KernelsMem as KernelsMem
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 lore -> PassM (Prog lore)) ->
  Pass lore lore
simplify :: (Prog lore -> PassM (Prog lore)) -> Pass lore lore
simplify = String
-> String -> (Prog lore -> PassM (Prog lore)) -> Pass lore lore
forall fromlore tolore.
String
-> String
-> (Prog fromlore -> PassM (Prog tolore))
-> Pass fromlore tolore
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 lore. (Prog lore -> PassM (Prog lore)) -> Pass lore lore
simplify Prog SOACS -> PassM (Prog SOACS)
SOACS.simplifySOACS

simplifyKernels :: Pass Kernels.Kernels Kernels.Kernels
simplifyKernels :: Pass Kernels Kernels
simplifyKernels = (Prog Kernels -> PassM (Prog Kernels)) -> Pass Kernels Kernels
forall lore. (Prog lore -> PassM (Prog lore)) -> Pass lore lore
simplify Prog Kernels -> PassM (Prog Kernels)
Kernels.simplifyKernels

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

simplifyKernelsMem :: Pass KernelsMem.KernelsMem KernelsMem.KernelsMem
simplifyKernelsMem :: Pass KernelsMem KernelsMem
simplifyKernelsMem = (Prog KernelsMem -> PassM (Prog KernelsMem))
-> Pass KernelsMem KernelsMem
forall lore. (Prog lore -> PassM (Prog lore)) -> Pass lore lore
simplify Prog KernelsMem -> PassM (Prog KernelsMem)
KernelsMem.simplifyProg

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