[I just found out that there is a dedicated bugs email address so forwarding the original message there.]
Hello, I've created a small example of the program I have at this URL with the output of -ddump-simpl: http://hpaste.org/fastcgi/hpaste.fcgi/view?id=10109#a10109 Notice that on line 139, I would like it if the Word8 could be passed without boxing. The full program text is here also in case the link above disappears: \begin{code} {-# LANGUAGE BangPatterns, MagicHash #-} module Main where import GHC.Word ( Word8(W8#) ) import GHC.Exts ( Int#, Int(I#), Ptr(..), Word#, Word(W#) ) import GHC.Prim ( indexWord8OffAddr#, (==#), (>=#), (+#), word2Int#, Addr# ) isSpaceWord8 :: Word8 -> Bool isSpaceWord8 !w = w == 0x20 || -- ' ' w == 0x09 || -- '\t' w == 0x0A || -- '\n' w == 0x0D -- '\r' {-# INLINE isSpaceWord8 #-} firstnonspace :: Ptr Word8 -> Int -> Int -> Int firstnonspace (Ptr p) (I# n) (I# m) = I# (first p n m) where first :: Addr# -> Int# -> Int# -> Int# first addr n' m' | n' >=# m' = n' | otherwise = if (not (isSpaceWord8 ch)) then n' else first addr (n' +# 1#) m' where ch = W8# (indexWord8OffAddr# addr n') {-# INLINE firstnonspace #-} main = return () \end{code} The output from ghc -O2 -ddump-simpl is: \begin{core} ==================== Tidy Core ==================== Main.a :: GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, () #) [GlobalId] [Arity 1 NoCafRefs Str: DmdType L] Main.a = \ (s_aHK :: GHC.Prim.State# GHC.Prim.RealWorld) -> (# s_aHK, GHC.Unit.() #) Main.a1 :: GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, () #) [GlobalId] [Arity 1 Str: DmdType L] Main.a1 = GHC.TopHandler.a5 @ () (Main.a `cast` (sym ((GHC.IOBase.:CoIO) ()) :: GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, () #) ~ GHC.IOBase.IO ())) Main.main :: GHC.IOBase.IO () [GlobalId] [Arity 1 NoCafRefs Str: DmdType L] Main.main = Main.a `cast` (sym ((GHC.IOBase.:CoIO) ()) :: GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, () #) ~ GHC.IOBase.IO ()) Main.lit :: GHC.Word.Word8 [GlobalId] [NoCafRefs Str: DmdType m] Main.lit = GHC.Word.W8# __word 13 Main.lit1 :: GHC.Word.Word8 [GlobalId] [NoCafRefs Str: DmdType m] Main.lit1 = GHC.Word.W8# __word 10 Main.lit2 :: GHC.Word.Word8 [GlobalId] [NoCafRefs Str: DmdType m] Main.lit2 = GHC.Word.W8# __word 9 Main.lit3 :: GHC.Word.Word8 [GlobalId] [NoCafRefs Str: DmdType m] Main.lit3 = GHC.Word.W8# __word 32 Main.isSpaceWord8 :: GHC.Word.Word8 -> GHC.Bool.Bool [GlobalId] [Arity 1 NoCafRefs Str: DmdType U(L)] Main.isSpaceWord8 = __inline_me (\ (w_ap1 :: GHC.Word.Word8) -> GHC.Classes.|| (GHC.Word.==2 w_ap1 Main.lit3) (GHC.Classes.|| (GHC.Word.==2 w_ap1 Main.lit2) (GHC.Classes.|| (GHC.Word.==2 w_ap1 Main.lit1) (GHC.Word.==2 w_ap1 Main.lit)))) Main.firstnonspace :: GHC.Ptr.Ptr GHC.Word.Word8 -> GHC.Types.Int -> GHC.Types.Int -> GHC.Types.Int [GlobalId] [Arity 3 NoCafRefs Str: DmdType U(L)U(L)U(L)m] Main.firstnonspace = __inline_me (\ (ds_dGa :: GHC.Ptr.Ptr GHC.Word.Word8) (ds1_dGb :: GHC.Types.Int) (ds2_dGc :: GHC.Types.Int) -> case ds_dGa of wild_B1 { GHC.Ptr.Ptr p_ap6 -> case ds1_dGb of wild1_XB { GHC.Types.I# n_ap8 -> case ds2_dGc of wild2_XG { GHC.Types.I# m_apa -> letrec { first_sH5 :: GHC.Prim.Addr# -> GHC.Prim.Int# -> GHC.Prim.Int# -> GHC.Prim.Int# [Arity 3 Str: DmdType LLL] first_sH5 = \ (addr_ape :: GHC.Prim.Addr#) (n'_apg :: GHC.Prim.Int#) (m'_api :: GHC.Prim.Int#) -> case GHC.Prim.>=# n'_apg m'_api of wild3_XS { GHC.Bool.False -> case GHC.Classes.not (Main.isSpaceWord8 (GHC.Word.W8# (GHC.Prim.indexWord8OffAddr# addr_ape n'_apg))) of wild4_XU { GHC.Bool.False -> first_sH5 addr_ape (GHC.Prim.+# n'_apg 1) m'_api; GHC.Bool.True -> n'_apg }; GHC.Bool.True -> n'_apg }; } in case first_sH5 p_ap6 n_ap8 m_apa of wild3_XN { __DEFAULT -> GHC.Types.I# wild3_XN } } } }) :Main.main :: GHC.IOBase.IO () [GlobalId] [Arity 1 Str: DmdType L] :Main.main = Main.a1 `cast` (sym ((GHC.IOBase.:CoIO) ()) :: GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, () #) ~ GHC.IOBase.IO ()) ==================== Tidy Core Rules ==================== \end{core} Of note is that isSpaceWord8 is not inlined and the Word8 that it takes is strict, but it gets boxed before it is passed there creating an allocation that I would prefer to avoid. My GHC version is 6.10.4. It may be related to this bug: http://hackage.haskell.org/trac/ghc/ticket/3181 Thanks, Jason
_______________________________________________ Glasgow-haskell-bugs mailing list [email protected] http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs
