futhark-0.7.3: src/Futhark/Optimise/MemoryBlockMerging/Reuse.hs
-- | Reuse the memory blocks of arrays.
--
-- Enable by setting the environment variable MEMORY_BLOCK_MERGING_REUSE=1.
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)