Bools are not unboxed

Tomasz Zielonka t.zielonka at
Sun Oct 3 09:07:01 EDT 2004


I was playing with monadic looping a'la replicateM_ and I created this

    for :: Int -> IO () -> IO ()
    for 0 _ = return ()
    for n x = x >> for (n - 1) x

Compiled with -O2, it is really fast and makes no unnecessary
allocations. Tested with this main

    main = for 10000000 (return ())

it gives the following stats

    <<ghc: 1024 bytes, 0 GCs, 0/0 avg/max bytes residency (0 samples),
    1M in use, 0,00 INIT (0,00 elapsed), 0,33 MUT (0,33 elapsed), 0,00 GC
    (0,00 elapsed) :ghc>>


( this is still 10 times slower than g++ -O3, but a similar pure function
  is only 3 times slower, and I am satisfied with such results (at this
  moment ;) )

Unfortunately, the program I was playing with could call 'for' with
negative n, for which it was supposed to make 0 iterations, and this
version definitely makes too many iterations.

So I made another version:

    for :: Int -> IO () -> IO ()
    for n x | n > 0     = x >> for (n - 1) x
	    | otherwise = return ()

To my surprise, it was much slower and made many allocations:

    <<ghc: 240927488 bytes, 920 GCs, 1036/1036 avg/max bytes residency (1
    samples), 1M in use, 0,00 INIT (0,00 elapsed), 2,48 MUT (2,50 elapsed),
    0,04 GC (0,05 elapsed) :ghc>>

I checked in -ddump-simpl that Ints are getting unboxed in both

Then I noticed the cause: 
    GHC.Prim.<# returns a boxed, heap allocated Bool, and so do other
    primitive comparison operators.

Would it be difficult to add Bool unboxing to GHC?
Maybe it would suffice to use preallocated False and True?

Best regards,

.signature: Too many levels of symbolic links

More information about the Glasgow-haskell-users mailing list