content: {-# LANGUAGE MagicHash     #-}
  {-# LANGUAGE UnboxedTuples #-}
  
  
  -- A reduced test case for #11627
  
  
  import GHC.Exts
  import GHC.Types (Int(..),IO(..))
  import System.Mem
  
  
  main :: IO ()
  main = do
      -- Allocate a large object (size >= 8/10 of one block = 8/10 * 4096 B)
      let nBytes = 123 * 4096
      b <- newBlob nBytes
  
      -- Shrink it by at least one word
      let delta = 100
      shrinkBlob b $ nBytes - delta
  
      -- Perform a heap census (assumes we are running with -i0, so a census is
      -- run after every GC)
      performGC
  
      -- Hold on to b so it is not GCed before the census
      shrinkBlob b $ nBytes - delta
  
  ------------------------------------------------------------------------------
  
  data Blob = Blob# !(MutableByteArray# RealWorld)
  
  newBlob :: Int -> IO Blob
  newBlob (I# n#) =
      IO $ \s -> case newByteArray# n# s of
                     (# s', mba# #) -> (# s', Blob# mba# #)
  
  shrinkBlob :: Blob -> Int -> IO ()
  shrinkBlob (Blob# mba#) (I# n#) =
      IO $ \s -> case shrinkMutableByteArray# mba# n# s of
                     s' -> (# s', () #)
  