unsafePerformIO and NOINLINE Pragma

David Sabel sabel at ki.informatik.uni-frankfurt.de
Tue Sep 13 10:13:05 EDT 2005


Hi,

> Hi!
> 
> I want to analyse the laziness of a data structure. To check how many nodes 
> are constructed I use a global counter.
> 
> counter :: IORef Int
> counter = unsafePerformIO (newIORef 0)
> 
> This counter is increased every time the constructor is called by redefining 
> the constructor OBDD as follows.
> 
> oBDD low var high =
>   seq (unsafePerformIO (modifyIORef counter (+1))) (OBDD low var high)
> 
> This works fine. 
> When I compile with optimisations the counter is always set to one no matter 
> how many nodes are constructed. I thought this would be caused by inlining. 
> Therefore I have added two NOINLINE pragmata.
> 
> {-# NOINLINE counter #-}
> {-# NOINLINE oBDD #-}
> 
> Although the counter doesn't work. Is there another optimisation that can 
> cause harm? Is there something wrong with the pragmata?

Two comments:
1. There are other optimisations than inlining that can break sharing, e.g. 
   common subexpression elimination, full-laziness-transformation.

2. I tested the following:

  {-# NOLINE counter #-}
  {-# INLINE oBDD #-}

  then the counter "seems" to work correct.  In my opinion 
  oBDD is an abstraction and can always be inlined.

Cheer,
  David


More information about the Glasgow-haskell-users mailing list