Calling internal functions - foo::bar() ?

Thomas Lindgren thomasl_erlang@REDACTED
Mon Mar 7 12:16:56 CET 2005

--- Bjorn Gustavsson <bjorn@REDACTED> wrote:
> (We haven't implemented the kind of optimization
> mentioned below,
> but we hope to do it in a future release.)
> James Hague <james.hague@REDACTED> writes:
> > Does the compiler not take advantage of functions
> being internal to a
> > module?  For example, if a function always returns
> a tuple which is
> > immediately unpacked, then the tuple construction
> can be avoided and
> > the values returned in Erlang registers.  At least
> I recall reading
> > about this somewhere.
> > 
> > If this is the case, then you wouldn't be able to
> call internal
> > functions directly.

Note that you can handle this by a simple high-level
transformation. For example, assume <A,B> is an
unboxed tuple and f/1 is originally a function
returning a tuple {A,B}. Then rewrite it as follows:

f(X) -> <A,B> = f_internal(X), {A,B}.

internal_f(X) -> Unboxed_definition_of_F.

(So internal_f/1 returns <E1,E2> rather than {E1,E2})

Here's the trick: inside the module, all local calls
to f are then rewritten to call internal_f, while
outside the module all remote calls (including ::, if
available) go to the ordinary f. 

Local calls will then exploit unboxed tuples, while
remote calls still use the default call/return

I believe some compilers (GHC?) do this as a
consequence of other optimizations (inlining, etc).
For example, a call f(E) would be optimized more or
less like this:

{P1,P2} = f(E)   

==> (inline f/1)

{P1,P2} = (begin <A,B> = internal_f(E), {A,B} end)   

==> (simplify mildly)

<A,B> = internal_f(E), P1=A, P2=B

Voila, the useless tuple is gone.


Celebrate Yahoo!'s 10th Birthday! 
Yahoo! Netrospective: 100 Moments of the Web

More information about the erlang-questions mailing list