X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fcmm%2FCmmExpr.hs;h=1769a01466c4f6a1205fc5d0c5f315493506aabf;hb=e4db45612e3efa59251239e1e0b8a0440783b966;hp=efa7fe32e709ebccece5f1256b94cc630f604c3d;hpb=fd8d04119e849f9c713d3e697228846d93c5ca69;p=ghc-hetmet.git diff --git a/compiler/cmm/CmmExpr.hs b/compiler/cmm/CmmExpr.hs index efa7fe3..1769a01 100644 --- a/compiler/cmm/CmmExpr.hs +++ b/compiler/cmm/CmmExpr.hs @@ -1,4 +1,3 @@ -{-# OPTIONS -Wall -fno-warn-name-shadowing #-} module CmmExpr ( CmmExpr(..), cmmExprRep, maybeInvertCmmExpr @@ -6,9 +5,9 @@ module CmmExpr , CmmLit(..), cmmLitRep , LocalReg(..), localRegRep, localRegGCFollow, GCKind(..) , GlobalReg(..), globalRegRep, spReg, hpReg, spLimReg, nodeReg, node - , UserOfLocalRegs, foldRegsUsed + , UserOfLocalRegs, foldRegsUsed, filterRegsUsed , RegSet, emptyRegSet, elemRegSet, extendRegSet, deleteFromRegSet, mkRegSet - , plusRegSet, minusRegSet + , plusRegSet, minusRegSet, timesRegSet ) where @@ -95,7 +94,7 @@ elemRegSet :: LocalReg -> RegSet -> Bool extendRegSet :: RegSet -> LocalReg -> RegSet deleteFromRegSet :: RegSet -> LocalReg -> RegSet mkRegSet :: [LocalReg] -> RegSet -minusRegSet, plusRegSet :: RegSet -> RegSet -> RegSet +minusRegSet, plusRegSet, timesRegSet :: RegSet -> RegSet -> RegSet emptyRegSet = emptyUniqSet elemRegSet = elementOfUniqSet @@ -104,6 +103,7 @@ deleteFromRegSet = delOneFromUniqSet mkRegSet = mkUniqSet minusRegSet = minusUniqSet plusRegSet = unionUniqSets +timesRegSet = intersectUniqSets ----------------------------------------------------------------------------- -- Register-use information for expressions and other types @@ -112,6 +112,11 @@ plusRegSet = unionUniqSets class UserOfLocalRegs a where foldRegsUsed :: (b -> LocalReg -> b) -> b -> a -> b +filterRegsUsed :: UserOfLocalRegs e => (LocalReg -> Bool) -> e -> RegSet +filterRegsUsed p e = + foldRegsUsed (\regs r -> if p r then extendRegSet regs r else regs) + emptyRegSet e + instance UserOfLocalRegs CmmReg where foldRegsUsed f z (CmmLocal reg) = f z reg foldRegsUsed _ z (CmmGlobal _) = z @@ -119,6 +124,9 @@ instance UserOfLocalRegs CmmReg where instance UserOfLocalRegs LocalReg where foldRegsUsed f z r = f z r +instance UserOfLocalRegs RegSet where + foldRegsUsed f = foldUniqSet (flip f) + instance UserOfLocalRegs CmmExpr where foldRegsUsed f z e = expr z e where expr z (CmmLit _) = z