Annotation for unfolding wanted

Jan-Willem Maessen jmaessen at
Tue Jul 31 10:36:53 EDT 2007

On Jul 31, 2007, at 10:20 AM, Simon Peyton-Jones wrote:

> | However my point was more on a semantic point of view: If I write  
> a function
> | in a recursive way, but actually do nothing else than a loop, I  
> would like
> | a) that the compiler unrolls it to a loop and
> | b) that I can specify such a requirement, while violating it  
> emits an error.
> What does it mean to say "the compiler unrolls it to a loop".  If  
> GHC sees a tail recursive function, it certainly compiles it to a  
> loop!  (But that's not called "unrolling".)

I think what's meant here is translating something like this:

{-# INLINE f #-}
f x y z = ...  f x' y' z' ...

into this:

{-# INLINE f #-}
f x y z = f' x y z
   where f' x y z = ... f' x' y' z' ...

That is, shoving (all of) the recursion in a level.  Then inlining f  
results in a fresh loop, which presumably can be specialized or  
optimized in various ways.  I did this in pH, mostly because it was  
less irritating than performing the same transformation by hand on  
key bits of the Prelude.  Whether it's actually beneficial on a large  
scale probably depends on the effectiveness of transformations that  
can specialise f' to the site where it was inlined; invariant  
argument elimination comes to mind here, and I never did a good job  
with that.  It does remove one irritant from performance tuning,  
though, by letting us write a simple top-level recursive function and  
have it inlined.


> Simon
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at

More information about the Glasgow-haskell-users mailing list