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