id,summary,reporter,owner,description,type,status,priority,milestone,component,version,resolution,keywords,cc,os,architecture,failure,difficulty,testcase,blockedby,blocking,related
888,Implement the static argument transformation,simonpj,,"The Static Argument transformation optimises
{{{ 
  f x y = ....f x' y...
}}}
into 
{{{
  f x y = let g x = ....g x'...
          in g x
}}}
Instead of passing {{{y}}} along unchanged, we make it into a free variable of a local function definition {{{g}}}.  

Unfortunately, it's not always a win.  Andre Santos gives a discussion, and quite a few numbers in [http://research.microsoft.com/%7Esimonpj/Papers/santos-thesis.ps.gz his thesis].

But sometimes it is a pretty big win.  Here's the example that recently motivated me, which Roman Leshchinskiy showed me.  You need the attached file Stream.hs, and then try compiling
{{{
  import Stream
  foo :: (a -> b) -> [a] -> [c]
  foo f = mapL f
}}}

Thus inspired, I think I have a set of criteria that would make the static arg transformation into a guaranteed win:
 
 * there is only one (external) call to the function
 * OR its RHS is small enough to inline
 * OR it is marked INLINE (?)

So I'd like to try this idea out.",task,new,normal,7.6.2,Compiler,6.4.2,,,Bulat.Ziganshin@… johan.tibell@… hackage.haskell.org@… reiner.pope@… Jake.McArthur@… choener@… dterei,Unknown/Multiple,Unknown/Multiple,None/Unknown,Unknown,N/A,,,
