[GHC] #13653: Re-allocate byteArray lead internal error: evacuate: strange closure type 241

GHC ghc-devs at haskell.org
Sat May 6 03:08:53 UTC 2017


#13653: Re-allocate byteArray lead internal error: evacuate: strange closure type
241
-------------------------------------+-------------------------------------
        Reporter:  winter            |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  high              |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:  x86_64
                                     |  (amd64)
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------
Description changed by winter:

@@ -15,0 +15,1 @@
+ import Data.Word
@@ -29,1 +30,1 @@
-         | otherwise = do let n' = (n + 1) `shiftL` 1
+         | otherwise = do let n' = n * 2
@@ -45,1 +46,1 @@
- main = print $ packN 64 (List.replicate 8192 128)
+ main = packN 64 (List.replicate 100000 128) `seq` return ()

New description:

 Compile and run following code lead to {{{evacuate: strange closure type
 XXX}}} on GHC 7.10.3/8.0.2/head, which is unreasonable. But running in
 GHCi is fine.

 {{{
 {-# LANGUAGE BangPatterns #-}
 {-# LANGUAGE MagicHash #-}
 {-# LANGUAGE UnboxedTuples #-}

 import qualified Data.List as List
 import GHC.Prim
 import Data.Primitive.ByteArray
 import GHC.Types
 import GHC.ST
 import Data.Word

 data Bytes = Bytes {-# UNPACK #-} !ByteArray -- payload
                    {-# UNPACK #-} !Int       -- s
                    {-# UNPACK #-} !Int       -- length

 packN :: Int -> [Word8] -> Bytes
 packN n0 ws0 = runST (newByteArray n0 >>= go 0 n0 ws0)
   where
     go :: Int -> Int -> [Word8] -> MutableByteArray s -> ST s Bytes
     go !i !n []     !mba = do ba <- unsafeFreezeByteArray mba
                               return (Bytes ba 0 i)
     go !i !n (w:ws) !mba
         | i <= n    = do writeByteArray mba i w
                          go (i+1) n ws mba
         | otherwise = do let n' = n * 2
                          -- mba' <- newByteArray n'  -- these dosen't work
 either
                          -- copyMutableByteArray mba' 0 mba 0 i
                          mba' <- resizeMutableByteArray mba n'
                          writeByteArray mba' i w
                          go (i+1) n' ws mba'

 resizeMutableByteArray :: MutableByteArray s -> Int -> ST s
 (MutableByteArray s)
 resizeMutableByteArray (MutableByteArray mba#) (I# i#) =
     ST (\ s# ->
             let (# s'#, mba'# #) = resizeMutableByteArray# mba# i# s#
             in (# s'#, MutableByteArray mba'# #)
        )

 main = packN 64 (List.replicate 100000 128) `seq` return ()
 }}}

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13653#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list