Transitive inlining

Manuel M. T. Chakravarty chak@cse.unsw.edu.au
Tue, 12 Dec 2000 00:41:01 +1100


In the context of the array library, we stumbled over
another problem.  Does GHC transitive inlining across
modules?  Let's say, we have the following scenario:

  module B (foo) where

  {-# INLINE foo #-}
  foo .. = ...bar...

  {-# INLINE bar #-}
  bar .. = ...


  module L (baz) where

  import B

  {#- INLINE baz #-}
  baz .. = ...B.foo...


  module Main where

  import L

  main .. = ...L.baz...

GHC in this case inlines the whole expression "...B.foo..."
in `Main', but will it inline the right hand side of `B.bar'
in `Main' (or even of `B.foo')?  If the INLINE pragma is
transitive across modules boundaries, one would hope so.

It seems that GHC is not (always?) doing this inlining,
which already for a very simple benchmark costs us a factor
of 5 runtime!  (With inlining - enforced by copying
definitions manually into `Main' - the code produced by GHC
is actually a little bit faster than the code for the
corresponding C program).

Cheers,
Manuel

PS: I had problems building GHCi and it seems as if my
    message to cvs-ghc@haskell.org doesn't get through
    somehow...