    {-# 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