[Git][ghc/ghc][wip/closure-size] ghc-heap: Add closure_size_noopt test
Ben Gamari
gitlab at gitlab.haskell.org
Mon Jun 10 06:03:26 UTC 2019
Ben Gamari pushed to branch wip/closure-size at Glasgow Haskell Compiler / GHC
Commits:
c1296951 by Ben Gamari at 2019-06-10T06:03:19Z
ghc-heap: Add closure_size_noopt test
This adds a new test, only run in the `normal` way, to verify the size
of FUNs and PAPs.
- - - - -
4 changed files:
- + libraries/ghc-heap/tests/ClosureSizeUtils.hs
- libraries/ghc-heap/tests/all.T
- libraries/ghc-heap/tests/closure_size.hs
- + libraries/ghc-heap/tests/closure_size_noopt.hs
Changes:
=====================================
libraries/ghc-heap/tests/ClosureSizeUtils.hs
=====================================
@@ -0,0 +1,52 @@
+{-# LANGUAGE CPP #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeInType #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- | Utilities for the @closure_size@ tests
+module ClosureSizeUtils (assertSize, assertSizeUnlifted) where
+
+import Control.Monad
+import GHC.Exts
+import GHC.Exts.Heap.Closures
+import GHC.Stack
+import Type.Reflection
+
+profHeaderSize :: Int
+#if PROFILING
+profHeaderSize = 2
+#else
+profHeaderSize = 0
+#endif
+
+assertSize
+ :: forall a. (HasCallStack, Typeable a)
+ => a -- ^ closure
+ -> Int -- ^ expected size in words
+ -> IO ()
+assertSize x =
+ assertSizeBox (asBox x) (typeRep @a)
+
+assertSizeUnlifted
+ :: forall (a :: TYPE 'UnliftedRep). (HasCallStack, Typeable a)
+ => a -- ^ closure
+ -> Int -- ^ expected size in words
+ -> IO ()
+assertSizeUnlifted x =
+ assertSizeBox (Box (unsafeCoerce# x)) (typeRep @a)
+
+assertSizeBox
+ :: forall a. (HasCallStack)
+ => Box -- ^ closure
+ -> TypeRep a
+ -> Int -- ^ expected size in words
+ -> IO ()
+assertSizeBox x ty expected = do
+ let !size = closureSize x
+ when (size /= expected') $ do
+ putStrLn $ "closureSize ("++show ty++") == "++show size++", expected "++show expected'
+ putStrLn $ prettyCallStack callStack
+ where expected' = expected + profHeaderSize
+{-# NOINLINE assertSize #-}
=====================================
libraries/ghc-heap/tests/all.T
=====================================
@@ -5,11 +5,22 @@ test('heap_all',
omit_ways(['ghci', 'hpc'])
],
compile_and_run, [''])
+
+# Test everything except FUNs and PAPs in all ways.
test('closure_size',
- [ when(have_profiling(), extra_ways(['prof'])),
+ [extra_files(['ClosureSizeUtils.hs']),
+ when(have_profiling(), extra_ways(['prof'])),
# These ways produce slightly different heap representations.
# Currently we don't test them.
omit_ways(['hpc'])
],
compile_and_run, [''])
+# Test PAPs and FUNs only in normal way (e.g. with -O0)
+# since otherwise the simplifier interferes.
+test('closure_size_noopt',
+ [extra_files(['ClosureSizeUtils.hs']),
+ only_ways(['normal'])
+ ],
+ compile_and_run, [''])
+
=====================================
libraries/ghc-heap/tests/closure_size.hs
=====================================
@@ -1,60 +1,12 @@
-{-# LANGUAGE BangPatterns #-}
-{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE TypeInType #-}
{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE CPP #-}
-import Control.Monad
-import Type.Reflection
import GHC.Exts
-import GHC.Stack
import GHC.IO
-
-import GHC.Exts.Heap.Closures
-
-assertSize
- :: forall a. (HasCallStack, Typeable a)
- => a -- ^ closure
- -> Int -- ^ expected size in words
- -> IO ()
-assertSize x =
- assertSizeBox (asBox x) (typeRep @a)
-
-assertSizeUnlifted
- :: forall (a :: TYPE 'UnliftedRep). (HasCallStack, Typeable a)
- => a -- ^ closure
- -> Int -- ^ expected size in words
- -> IO ()
-assertSizeUnlifted x =
- assertSizeBox (Box (unsafeCoerce# x)) (typeRep @a)
-
-assertSizeBox
- :: forall a. (HasCallStack)
- => Box -- ^ closure
- -> TypeRep a
- -> Int -- ^ expected size in words
- -> IO ()
-assertSizeBox x ty expected = do
- let !size = closureSize x
- when (size /= expected') $ do
- putStrLn $ "closureSize ("++show ty++") == "++show size++", expected "++show expected'
- putStrLn $ prettyCallStack callStack
- where expected' = expected + profHeaderSize
-{-# NOINLINE assertSize #-}
-
-pap :: Int -> Char -> Int
-pap x _ = x
-{-# NOINLINE pap #-}
-
-profHeaderSize :: Int
-#if PROFILING
-profHeaderSize = 2
-#else
-profHeaderSize = 0
-#endif
+import ClosureSizeUtils
data A = A (Array# Int)
data MA = MA (MutableArray# RealWorld Int)
@@ -72,12 +24,6 @@ main = do
assertSize ((1,2) :: (Int,Int)) 3
assertSize ((1,2,3) :: (Int,Int,Int)) 4
- -- These depend too much upon the behavior of the simplifier to
- -- test reliably.
- --assertSize (id :: Int -> Int) 1
- --assertSize (fst :: (Int,Int) -> Int) 1
- --assertSize (pap 1) 2
-
MA ma <- IO $ \s ->
case newArray# 0# 0 s of
(# s1, x #) -> (# s1, MA x #)
=====================================
libraries/ghc-heap/tests/closure_size_noopt.hs
=====================================
@@ -0,0 +1,12 @@
+import ClosureSizeUtils
+
+pap :: Int -> Char -> Int
+pap x _ = x
+{-# NOINLINE pap #-}
+
+main :: IO ()
+main = do
+ assertSize (id :: Int -> Int) 1
+ assertSize (fst :: (Int,Int) -> Int) 1
+ assertSize (pap 1) 2
+
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/commit/c129695194267a13d5c3c3f99013a3db377cce13
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/commit/c129695194267a13d5c3c3f99013a3db377cce13
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20190610/3f088a66/attachment-0001.html>
More information about the ghc-commits
mailing list