{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}

module GHC.Cmm.LRegSet (
    LRegSet,

    emptyLRegSet,
    nullLRegSet,
    insertLRegSet,
    elemLRegSet,

    deleteFromLRegSet,
    sizeLRegSet,

    unionLRegSet,
    unionsLRegSet,
    elemsLRegSet
  ) where

import GHC.Prelude
import GHC.Types.Unique
import GHC.Types.Unique.Set
import GHC.Cmm.Expr

-- Compact sets for membership tests of local variables.

type LRegSet = UniqueSet

{-# INLINE emptyLRegSet #-}
emptyLRegSet :: LRegSet
emptyLRegSet :: LRegSet
emptyLRegSet = LRegSet
emptyUniqueSet

{-# INLINE nullLRegSet #-}
nullLRegSet :: LRegSet -> Bool
nullLRegSet :: LRegSet -> Bool
nullLRegSet = LRegSet -> Bool
nullUniqueSet

{-# INLINE insertLRegSet #-}
insertLRegSet :: LocalReg -> LRegSet -> LRegSet
insertLRegSet :: LocalReg -> LRegSet -> LRegSet
insertLRegSet LocalReg
l = Unique -> LRegSet -> LRegSet
insertUniqueSet (LocalReg -> Unique
forall a. Uniquable a => a -> Unique
getUnique LocalReg
l)

{-# INLINE elemLRegSet #-}
elemLRegSet :: LocalReg -> LRegSet -> Bool
elemLRegSet :: LocalReg -> LRegSet -> Bool
elemLRegSet LocalReg
l = Unique -> LRegSet -> Bool
memberUniqueSet (LocalReg -> Unique
forall a. Uniquable a => a -> Unique
getUnique LocalReg
l)

{-# INLINE deleteFromLRegSet #-}
deleteFromLRegSet :: LRegSet -> LocalReg -> LRegSet
deleteFromLRegSet :: LRegSet -> LocalReg -> LRegSet
deleteFromLRegSet LRegSet
set LocalReg
reg = Unique -> LRegSet -> LRegSet
deleteUniqueSet (LocalReg -> Unique
forall a. Uniquable a => a -> Unique
getUnique LocalReg
reg) LRegSet
set

{-# INLINE sizeLRegSet #-}
sizeLRegSet :: LRegSet -> Int
sizeLRegSet :: LRegSet -> Int
sizeLRegSet = LRegSet -> Int
sizeUniqueSet

{-# INLINE unionLRegSet #-}
unionLRegSet :: LRegSet -> LRegSet -> LRegSet
unionLRegSet :: LRegSet -> LRegSet -> LRegSet
unionLRegSet = LRegSet -> LRegSet -> LRegSet
unionUniqueSet

{-# INLINE unionsLRegSet #-}
unionsLRegSet :: [LRegSet] -> LRegSet
unionsLRegSet :: [LRegSet] -> LRegSet
unionsLRegSet = [LRegSet] -> LRegSet
unionsUniqueSet

{-# INLINE elemsLRegSet #-}
elemsLRegSet :: LRegSet -> [Unique]
elemsLRegSet :: LRegSet -> [Unique]
elemsLRegSet = LRegSet -> [Unique]
elemsUniqueSet