GHC thinks it is smarter than me [was: RE: Transitive inlining]

Manuel M. T. Chakravarty chak@cse.unsw.edu.au
Mon, 25 Dec 2000 23:25:15 +1100


"Manuel M. T. Chakravarty" <chak@cse.unsw.edu.au> wrote,

> Meanwhile, I think, the lack of inlining that I saw isn't
> connected to modules.  Instead, the problem is that GHC
> thinks it knows more about my program than I do.  More
> precisely, it seems to take an INLINE pragma just as an
> encouragement rather than a command to inline.  In
> particular - at least if a function is large enough - it
> doesn't inline the function anymore if the function is used
> more than once.[1]

Actually, the current behaviour - at least, as I understand
it - in combination with modules leads IMHO to rather
inconsistent behaviour.  Given a module

  module M (foo) 
  where

  {#- INLINE foo #-}
  foo = <biggish definition>

GHC will not inline `foo' in

  module Main
  where

  import M

  bar = ...foo a...

  main = ...foo b...bar...

However, it will inline foo twice in case of

  module N (bar)
  where

  import N

  bar = ...foo a...


  module Main
  where

  import M
  import N

  main = ...foo b...bar...

although it is exactly the same code.  In other words, using
many modules leads to larger binaries and faster code.

All this is understandable given that optimisation always
included heuristics.  However, for programmer supplied
annotations, I think, it is problematic.

Cheers,
Manuel