{-# LANGUAGE FlexibleContexts #-} -- | Optimisation pipelines. module Futhark.Passes ( standardPipeline , sequentialPipeline , kernelsPipeline , sequentialCpuPipeline , gpuPipeline ) where import Control.Category ((>>>)) import Futhark.Optimise.CSE import Futhark.Optimise.Fusion import Futhark.Optimise.InPlaceLowering import Futhark.Optimise.InliningDeadFun import Futhark.Optimise.TileLoops import Futhark.Optimise.DoubleBuffer import Futhark.Optimise.Unstream import Futhark.Pass.ExpandAllocations import Futhark.Pass.ExplicitAllocations import Futhark.Pass.ExtractKernels import Futhark.Pass.FirstOrderTransform import Futhark.Pass.KernelBabysitting import Futhark.Pass.ResolveAssertions import Futhark.Pass.Simplify import Futhark.Pipeline import Futhark.Representation.ExplicitMemory (ExplicitMemory) import Futhark.Representation.Kernels (Kernels) import Futhark.Representation.SOACS (SOACS) standardPipeline :: Pipeline SOACS SOACS standardPipeline = passes [ simplifySOACS , inlineAndRemoveDeadFunctions , performCSE True , simplifySOACS -- We run fusion twice , fuseSOACs , performCSE True , simplifySOACS , fuseSOACs , performCSE True , simplifySOACS , resolveAssertions , removeDeadFunctions ] kernelsPipeline :: Pipeline SOACS Kernels kernelsPipeline = standardPipeline >>> onePass extractKernels >>> passes [ simplifyKernels , babysitKernels , tileLoops , unstream , performCSE True , simplifyKernels , inPlaceLowering ] sequentialPipeline :: Pipeline SOACS Kernels sequentialPipeline = standardPipeline >>> onePass firstOrderTransform >>> passes [ simplifyKernels , inPlaceLowering ] sequentialCpuPipeline :: Pipeline SOACS ExplicitMemory sequentialCpuPipeline = sequentialPipeline >>> onePass explicitAllocations >>> passes [ performCSE False , simplifyExplicitMemory , doubleBuffer , simplifyExplicitMemory ] gpuPipeline :: Pipeline SOACS ExplicitMemory gpuPipeline = kernelsPipeline >>> onePass explicitAllocations >>> passes [ simplifyExplicitMemory , performCSE False , simplifyExplicitMemory , doubleBuffer , simplifyExplicitMemory , expandAllocations , simplifyExplicitMemory ]