module Futhark.Optimise.MemoryBlockMerging.Reuse
( reuseInProg
) where
import Futhark.Pass
import Futhark.MonadFreshNames
import Futhark.Representation.AST
import Futhark.Representation.ExplicitMemory (ExplicitMemory)
import Futhark.Optimise.MemoryBlockMerging.AuxiliaryInfo
import Futhark.Optimise.MemoryBlockMerging.Reuse.AllocationSizeMovingUp
import Futhark.Optimise.MemoryBlockMerging.Reuse.Core
reuseInProg :: Prog ExplicitMemory -> PassM (Prog ExplicitMemory)
reuseInProg = intraproceduralTransformation reuseInFunDef
reuseInFunDef :: MonadFreshNames m
=> FunDef ExplicitMemory
-> m (FunDef ExplicitMemory)
reuseInFunDef fundef0 = do
let fundef1 = moveUpAllocSizesFunDef fundef0
aux1 = getAuxiliaryInfo fundef1
coreReuseFunDef fundef1
(auxFirstUses aux1) (auxInterferences aux1)
(auxPotentialKernelDataRaceInterferences aux1) (auxVarMemMappings aux1)
(auxActualVariables aux1) (auxExistentials aux1)