Alain Frisch wrote:
Brian Hurt wrote:
  
where the function is only called from one place, or 3) where inlining
opened up signifigant other optimization opportunities.  The classic
example for Ocaml here is replacing a call to Pervasives.compare with an
integer compare.  Most of the rest of the time, inlining is either a
break even proposition, or often a loss.
    

Another good situation is when inlining allows the compiler to turn a
function call to an unknown location into a direct function call (or no
function call at all). This happens as soon as you write "List.map (fun
x -> ...)". Inlining List.map would avoid the allocation of the closure
and a computed call (and then the local abstraction will also be inlined
in the body of the inlined List.map because it is used only once).
Currently, OCaml never inlines recursive functions.

  

This qualifies as an optimization opportunity- turning a call to caml_apply into a direct function call is an optimization.  Which may open up other optimization possibilities.  But that was my point- if the only thing you're getting out of inlining a function is skipping a function call (to a known location), then inlining generally isn't worth it- it's only worth it if it opens up other possibilities.

Brian