Annotation for unfolding wanted
Jan-Willem Maessen
jmaessen at alum.mit.edu
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.
-Jan
>
> Simon
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
More information about the Glasgow-haskell-users
mailing list