GHC/Cmm/LRegSet.hs

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

    module GHC.Cmm.LRegSet (
        LRegSet,
        LRegKey,

        emptyLRegSet,
        nullLRegSet,
        insertLRegSet,
        elemLRegSet,

        deleteFromLRegSet,
        sizeLRegSet,

        plusLRegSet,
        elemsLRegSet
      ) where

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

    import Data.IntSet as IntSet

    -- Compact sets for membership tests of local variables.

    type LRegSet = IntSet.IntSet
    type LRegKey = Int

    emptyLRegSet :: LRegSet
    emptyLRegSet = IntSet.empty

    nullLRegSet :: LRegSet -> Bool
    nullLRegSet = IntSet.null

    insertLRegSet :: LocalReg -> LRegSet -> LRegSet
    insertLRegSet l = IntSet.insert (getKey (getUnique l))

    elemLRegSet :: LocalReg -> LRegSet -> Bool
    elemLRegSet l = IntSet.member (getKey (getUnique l))

    deleteFromLRegSet :: LRegSet -> LocalReg -> LRegSet
    deleteFromLRegSet set reg = IntSet.delete (getKey . getUnique $ reg) set

    sizeLRegSet :: IntSet -> Int
    sizeLRegSet = IntSet.size

    plusLRegSet :: IntSet -> IntSet -> IntSet
    plusLRegSet = IntSet.union

    elemsLRegSet :: IntSet -> [Int]
    elemsLRegSet = IntSet.toList