ghc-9.8.1: GHC/Stg/Lift/Types.hs
{-# LANGUAGE TypeFamilies, DataKinds, GADTs, FlexibleInstances #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE ConstraintKinds #-}
-- This module declares some basic types used by GHC.Stg.Lift
-- We can import this module into GHC.Stg.Syntax, where the
-- type instance declartions for BinderP etc live
module GHC.Stg.Lift.Types(
Skeleton(..),
bothSk, altSk, rhsSk,
BinderInfo(..),
binderInfoBndr, binderInfoOccursAsArg
) where
import GHC.Prelude
import GHC.Types.Id
import GHC.Types.Demand
import GHC.Types.Var.Set
import GHC.Utils.Outputable
-- | Captures details of the syntax tree relevant to the cost model, such as
-- closures, multi-shot lambdas and case expressions.
data Skeleton
= ClosureSk !Id !DIdSet {- ^ free vars -} !Skeleton
| RhsSk !Card {- ^ how often the RHS was entered -} !Skeleton
| AltSk !Skeleton !Skeleton
| BothSk !Skeleton !Skeleton
| NilSk
bothSk :: Skeleton -> Skeleton -> Skeleton
bothSk NilSk b = b
bothSk a NilSk = a
bothSk a b = BothSk a b
altSk :: Skeleton -> Skeleton -> Skeleton
altSk NilSk b = b
altSk a NilSk = a
altSk a b = AltSk a b
rhsSk :: Card -> Skeleton -> Skeleton
rhsSk _ NilSk = NilSk
rhsSk body_dmd skel = RhsSk body_dmd skel
-- | The type used in binder positions in 'GenStgExpr's.
data BinderInfo
= BindsClosure !Id !Bool -- ^ Let(-no-escape)-bound thing with a flag
-- indicating whether it occurs as an argument
-- or in a nullary application
-- (see "GHC.Stg.Lift.Analysis#arg_occs").
| BoringBinder !Id -- ^ Every other kind of binder
-- | Gets the bound 'Id' out a 'BinderInfo'.
binderInfoBndr :: BinderInfo -> Id
binderInfoBndr (BoringBinder bndr) = bndr
binderInfoBndr (BindsClosure bndr _) = bndr
-- | Returns 'Nothing' for 'BoringBinder's and 'Just' the flag indicating
-- occurrences as argument or in a nullary applications otherwise.
binderInfoOccursAsArg :: BinderInfo -> Maybe Bool
binderInfoOccursAsArg BoringBinder{} = Nothing
binderInfoOccursAsArg (BindsClosure _ b) = Just b
instance Outputable Skeleton where
ppr NilSk = text ""
ppr (AltSk l r) = vcat
[ text "{ " <+> ppr l
, text "ALT"
, text " " <+> ppr r
, text "}"
]
ppr (BothSk l r) = ppr l $$ ppr r
ppr (ClosureSk f fvs body) = ppr f <+> ppr fvs $$ nest 2 (ppr body)
ppr (RhsSk card body) = hcat
[ lambda
, ppr card
, dot
, ppr body
]
instance Outputable BinderInfo where
ppr = ppr . binderInfoBndr
instance OutputableBndr BinderInfo where
pprBndr b = pprBndr b . binderInfoBndr
pprPrefixOcc = pprPrefixOcc . binderInfoBndr
pprInfixOcc = pprInfixOcc . binderInfoBndr
bndrIsJoin_maybe = bndrIsJoin_maybe . binderInfoBndr