Improve handling of newtypes (fixes Trac 1495)
[ghc-hetmet.git] / compiler / specialise / SpecConstr.lhs
index 256674b..d1c7499 100644 (file)
@@ -27,11 +27,11 @@ import CoreTidy             ( tidyRules )
 import PprCore         ( pprRules )
 import WwLib           ( mkWorkerArgs )
 import DataCon         ( dataConRepArity, dataConUnivTyVars )
-import Type            ( Type, tyConAppArgs )
-import Coercion                ( coercionKind )
+import Coercion        
+import Type            hiding( substTy )
 import Id              ( Id, idName, idType, isDataConWorkId_maybe, idArity,
                          mkUserLocal, mkSysLocal, idUnfolding, isLocalId )
-import Var             ( Var )
+import Var
 import VarEnv
 import VarSet
 import Name
@@ -456,9 +456,9 @@ specConstrProgram dflags us binds
 %************************************************************************
 
 \begin{code}
-data ScEnv = SCE { sc_size :: Int,     -- Size threshold
+data ScEnv = SCE { sc_size :: Maybe Int,       -- Size threshold
 
-                  sc_subst :: Subst,   -- Current substitution
+                  sc_subst :: Subst,           -- Current substitution
 
                   sc_how_bound :: HowBoundEnv,
                        -- Binds interesting non-top-level variables
@@ -491,7 +491,7 @@ instance Outputable Value where
 
 ---------------------
 initScEnv dflags
-  = SCE { sc_size = specThreshold dflags,
+  = SCE { sc_size = specConstrThreshold dflags,
          sc_subst = emptySubst, 
          sc_how_bound = emptyVarEnv, 
          sc_vals = emptyVarEnv }
@@ -824,7 +824,8 @@ scExpr' env e@(App _ _)
 ----------------------
 scBind :: ScEnv -> CoreBind -> UniqSM (ScEnv, ScUsage, CoreBind)
 scBind env (Rec prs)
-  | not (all (couldBeSmallEnoughToInline (sc_size env)) rhss)
+  | Just threshold <- sc_size env
+  , not (all (couldBeSmallEnoughToInline threshold) rhss)
                -- No specialisation
   = do { let (rhs_env,bndrs') = extendRecBndrs env bndrs
        ; (rhs_usgs, rhss') <- mapAndUnzipUs (scExpr rhs_env) rhss
@@ -1107,10 +1108,15 @@ argToPat in_scope val_env (Let _ arg) arg_occ
 
 argToPat in_scope val_env (Cast arg co) arg_occ
   = do { (interesting, arg') <- argToPat in_scope val_env arg arg_occ
-       ; if interesting then 
-               return (interesting, Cast arg' co)
-         else 
-               wildCardPat (snd (coercionKind co)) }
+       ; let (ty1,ty2) = coercionKind co
+       ; if not interesting then 
+               wildCardPat ty2
+         else do
+       { -- Make a wild-card pattern for the coercion
+         uniq <- getUniqueUs
+       ; let co_name = mkSysTvName uniq FSLIT("sg")
+             co_var = mkCoVar co_name (mkCoKind ty1 ty2)
+       ; return (interesting, Cast arg' (mkTyVarTy co_var)) } }
 
 {-     Disabling lambda specialisation for now
        It's fragile, and the spec_loop can be infinite