futhark-0.11.1: src/Futhark/Analysis/Usage.hs
{-# LANGUAGE FlexibleContexts #-}
module Futhark.Analysis.Usage ( usageInStm ) where
import Data.Foldable
import qualified Data.Set as S
import Futhark.Representation.AST
import Futhark.Representation.AST.Attributes.Aliases
import qualified Futhark.Analysis.UsageTable as UT
usageInStm :: (Attributes lore, Aliased lore) => Stm lore -> UT.UsageTable
usageInStm (Let pat lore e) =
mconcat [usageInPat,
usageInExpLore,
usageInExp e,
UT.usages (freeIn e)]
where usageInPat =
UT.usages (mconcat (map freeIn $ patternElements pat)
`S.difference`
S.fromList (patternNames pat))
usageInExpLore =
UT.usages $ freeIn lore
usageInExp :: Aliased lore => Exp lore -> UT.UsageTable
usageInExp (Apply _ args _ _) =
mconcat [ mconcat $ map UT.consumedUsage $
S.toList $ subExpAliases arg
| (arg,d) <- args, d == Consume ]
usageInExp (DoLoop _ merge _ _) =
mconcat [ mconcat $ map UT.consumedUsage $
S.toList $ subExpAliases se
| (v,se) <- merge, unique $ paramDeclType v ]
usageInExp (If _ tbranch fbranch _) =
fold $ map UT.consumedUsage $ S.toList $
consumedInBody tbranch <> consumedInBody fbranch
usageInExp (BasicOp (Update src _ _)) =
UT.consumedUsage src
usageInExp (Op op) =
mconcat $ map UT.consumedUsage (S.toList $ consumedInOp op)
usageInExp _ = UT.empty