Skip to content
  • Simon Peyton Jones's avatar
    Major change in compilation of instance declarations (fix Trac #955, #2328) · f16dbbbe
    Simon Peyton Jones authored
    This patch makes an important change to the way that dictionary
    functions are handled.  Before, they were unconditionally marked
    INLIINE, but all the code written by the user in the instance
    was inside that unconditionally-inlined function.  Result: massive
    code bloat in programs that use complicated instances.
    
    This patch make instances behave rather as if all the methods
    were written in separate definitions.  That dramatically reduces
    bloat.  The new plan is described in TcInstDcls
    	Note [How instance declarations are translated]
    
    Everything validates.  The major code-bloat bug is squashed: in particular
    DoCon is fine now (Trac #2328) and I believe that #955 is also better.
    
    Nofib results:
    
    Binary sizes
            -1 s.d.      +2.5%
            +1 s.d.      +3.1%
            Average      +2.8%
    
    Allocations
            -1 s.d.      -6.4%
            +1 s.d.      +2.5%
            Average      -2.0%
    
    Note that 2% improvement.  Some programs improve by 20% (rewrite)!
    Two get slightly worse: pic (2.1%), and gameteb (3.2%), but all others
    improve or stay the same.
    
    I am not absolutely 100% certain that all the corners are correct; for
    example, when default methods are marked INLINE, are they inlined?  But
    overall it's better.
    
    It's nice that the patch also removes a lot of code.  I deleted some
    out of date comments, but there's something like 100 fewer lines of
    code in the new version!  (In the line counts below, there are a lot
    of new comments.)
    f16dbbbe