[Haskell] Expecting more inlining for bit shifting

Simon Peyton-Jones simonpj at microsoft.com
Tue Oct 10 03:31:25 EDT 2006


| I would have imagined an optimisation step that only activates when a
| constructor is passed into a function to see if it produces a branch
that
| can be precomputed, and then tries to determine if it is worth making
a
| specialized function with that case eliminated.  Or possibly having
each
| function inspected to see if it has branches that could be eliminated
if a
| constructor was passed as an argument.

That's precisely what GHC does.  My explanation before was too brief,
sorry.  The algorithm is described in "Secrets of the GHC inliner"
http://research.microsoft.com/%7Esimonpj/Papers/inlining/index.htm

But it still only makes a specialised copy if the function is "small
enough".  Obviously a great big function with a tiny specialisation
opportunity would be a poor candidate.  

| I must say I'm extremely disappointed with this.  I believe I was
taught
| in my undergraduate CS program (but perhaps I wasn't) that one ought
not
| to make these sorts of trivial hand optimisations, because compilers
are
| smart enough to figure out these sorts of things by themselves, and
they
| know more about that target platform that you do.  In particular the
| propaganda about side-effect-free functional languages was a promise
that
| they would use the strong types and side-effect-freeness to do all
sorts
| of wonderful optimisations.

Well I think if you use -ddump-simpl you'll see a program that often
looks pretty different to the one you wrote.  I often have difficulty
figuring out just how GHC managed to transform the source program into
the optimised one.

Of course it's far from perfect!  Fortunately, GHC is an open-source
compiler, so the way lies open for anyone, including you, to improve the
inlining decisions.  I'm sure there are good opportunities there.

Simon

PS: you mention "knowing about the target platform".  That's one thing
that GHC is distinctly poor on.  It leaves all target-platform-specific
optimisations to the C compiler.


More information about the Glasgow-haskell-users mailing list