Thu Oct  7 04:10:51 PDT 2010  [email protected]
  * Implement auto-specialisation of imported Ids
  
  This big-ish patch arranges that if an Id 'f' is 
    * Type-class overloaded 
         f :: Ord a => [a] -> [a]
    * Defined with an INLINABLE pragma
         {-# INLINABLE f #-}
    * Exported from its defining module 'D'
  
  then in any module 'U' that imports D
  
  1. Any call of 'f' at a fixed type will generate 
     (a) a specialised version of f in U
     (b) a RULE that rewrites unspecialised calls to the
         specialised on
  
    e.g. if the call is (f Int dOrdInt xs) then the 
    specialiser will generate
       $sfInt :: [Int] -> [Int]
       $sfInt = <code for f, imported from D, specialised>
       {-# RULE forall d.  f Int d = $sfInt #-}
  
  2. In addition, you can give an explicit {-# SPECIALISE -#}
     pragma for the imported Id
       {-# SPECIALISE f :: [Bool] -> [Bool] #-}
     This too generates a local specialised definition, 
     and the corresponding RULE 
  
  The new RULES are exported from module 'U', so that any module
  importing U will see the specialised versions of 'f', and will
  not re-specialise them.
  
  There's a flag -fwarn-auto-orphan that warns you if the auto-generated
  RULES are orphan rules. It's not in -Wall, mainly to avoid lots of
  error messages with existing packages.
  
  Main implementation changes
  
   - A new flag on a CoreRule to say if it was auto-generated.
     This is persisted across interface files, so there's a small
     change in interface file format.
  
   - Quite a bit of fiddling with plumbing, to get the 
     {-# SPECIALISE #-} pragmas for imported Ids.  In particular, a
     new field tgc_imp_specs in TcGblEnv, to keep the specialise
     pragmas for imported Ids between the typechecker and the desugarer.
  
   - Some new code (although surprisingly little) in Specialise,
     to deal with calls of imported Ids

    M ./compiler/basicTypes/BasicTypes.lhs -1 +7
    M ./compiler/coreSyn/CoreSyn.lhs -1 +5
    M ./compiler/deSugar/Desugar.lhs -14 +24
    M ./compiler/deSugar/DsBinds.lhs -55 +66
    M ./compiler/deSugar/DsForeign.lhs -4 +4
    M ./compiler/hsSyn/HsBinds.lhs -9 +9
    M ./compiler/iface/BinIface.hs -2 +4
    M ./compiler/iface/IfaceSyn.lhs -1 +3
    M ./compiler/iface/MkIface.lhs -6 +12
    M ./compiler/iface/TcIface.lhs -1 +3
    M ./compiler/main/DynFlags.hs +3
    M ./compiler/rename/RnBinds.lhs -62 +84
    M ./compiler/rename/RnEnv.lhs -9 +14
    M ./compiler/rename/RnExpr.lhs -3 +3
    M ./compiler/rename/RnSource.lhs -1 +1
    M ./compiler/specialise/Rules.lhs -19 +11
    M ./compiler/specialise/SpecConstr.lhs -1 +2
    M ./compiler/specialise/Specialise.lhs -59 +156
    M ./compiler/typecheck/TcBinds.lhs -24 +66
    M ./compiler/typecheck/TcClassDcl.lhs -1 +1
    M ./compiler/typecheck/TcDeriv.lhs -4 +2
    M ./compiler/typecheck/TcHsSyn.lhs -6 +12
    M ./compiler/typecheck/TcInstDcls.lhs -10 +19
    M ./compiler/typecheck/TcRnDriver.lhs -13 +16
    M ./compiler/typecheck/TcRnMonad.lhs -14 +15
    M ./compiler/typecheck/TcRnTypes.lhs +1
    M ./compiler/utils/FiniteMap.lhs -1 +3

View patch online:
http://darcs.haskell.org/cgi-bin/darcsweb.cgi?r=ghc;a=darcs_commitdiff;h=20101007111051-1287e-fcc4ccc3fa35ba0467ce2fd14d3b46f2ea802546.gz

_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to