Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : cardinality

http://hackage.haskell.org/trac/ghc/changeset/8adb606c9c4bb139a76d1c2bd56b6004946ddf5a

>---------------------------------------------------------------

commit 8adb606c9c4bb139a76d1c2bd56b6004946ddf5a
Author: ilyasergey <ilya.ser...@gmail.com>
Date:   Thu Nov 8 16:34:35 2012 +0100

    product demand machinery adapted to handle cardinality

>---------------------------------------------------------------

 compiler/basicTypes/Demand.lhs     |   20 ++++++++++----------
 compiler/basicTypes/MkId.lhs       |    2 +-
 compiler/specialise/SpecConstr.lhs |    2 +-
 compiler/stranal/DmdAnal.lhs       |    5 +++--
 compiler/stranal/WwLib.lhs         |    2 +-
 5 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/compiler/basicTypes/Demand.lhs b/compiler/basicTypes/Demand.lhs
index 6e333f2..2f29da5 100644
--- a/compiler/basicTypes/Demand.lhs
+++ b/compiler/basicTypes/Demand.lhs
@@ -242,7 +242,7 @@ isUsedOnce Abs            = True
 isUsedOnce (Used One)     = True 
 isUsedOnce (UHead One)    = True 
 isUsedOnce (UCall One _)  = True
-isUsedOnce (UProd One ux) = all isUsedOnce ux
+isUsedOnce (UProd One ux) = True
 isUsedOnce _              = False
 
 absCall :: Count -> AbsDmd -> AbsDmd
@@ -417,12 +417,12 @@ mkJointDmd s a
      (HyperStr, UProd c _) -> JD {strd = HyperStr, absd = Used c}
      _                     -> JD {strd = s, absd = a}
 
-mkProdDmd :: [JointDmd] -> JointDmd
-mkProdDmd dx 
+mkProdDmd :: Count -> [JointDmd] -> JointDmd
+mkProdDmd c dx 
   = mkJointDmd sp up 
   where
     sp = strProd $ map strd dx
-    up = absProd One $ map absd dx   
+    up = absProd c $ map absd dx   
      
 instance LatticeLike JointDmd where
   bot                        = mkJointDmd bot bot
@@ -621,15 +621,15 @@ isPolyDmd :: Demand -> Bool
 isPolyDmd (JD {strd=a, absd=b}) = isPolyStrDmd a && isPolyAbsDmd b
 
 -- Split a product to parameteres
-splitProdDmd :: Demand -> [Demand]
-splitProdDmd JD {strd=SProd sx, absd=UProd _ ux}
-  = ASSERT( sx `lengthIs` (length ux) ) zipWith mkJointDmd sx ux
+splitProdDmd :: Demand -> (Count, [Demand])
+splitProdDmd JD {strd=SProd sx, absd=UProd c ux}
+  = ASSERT( sx `lengthIs` (length ux) ) (c, zipWith mkJointDmd sx ux)
 splitProdDmd JD {strd=SProd sx, absd=u} 
   | isPolyAbsDmd u  
-  =  zipWith mkJointDmd sx (replicateAbsDmd (length sx) u)
-splitProdDmd (JD {strd=s, absd=UProd _ ux})
+  =  (card u, zipWith mkJointDmd sx (replicateAbsDmd (length sx) u))
+splitProdDmd (JD {strd=s, absd=UProd c ux})
   | isPolyStrDmd s  
-  =  zipWith mkJointDmd (replicateStrDmd (length ux) s) ux
+  =  (c, zipWith mkJointDmd (replicateStrDmd (length ux) s) ux)
 splitProdDmd d = pprPanic "splitProdDmd" (ppr d)
 
 \end{code}
diff --git a/compiler/basicTypes/MkId.lhs b/compiler/basicTypes/MkId.lhs
index 05b45ab..25c7453 100644
--- a/compiler/basicTypes/MkId.lhs
+++ b/compiler/basicTypes/MkId.lhs
@@ -486,7 +486,7 @@ mkDictSelId dflags no_unf name clas
 
     strict_sig = mkStrictSig (mkTopDmdType [arg_dmd] topRes)
     arg_dmd | new_tycon = evalDmd
-            | otherwise = mkProdDmd [ if the_arg_id == id then evalDmd else 
absDmd
+            | otherwise = mkProdDmd Many [ if the_arg_id == id then evalDmd 
else absDmd
                                           | id <- arg_ids ]
 
 
diff --git a/compiler/specialise/SpecConstr.lhs 
b/compiler/specialise/SpecConstr.lhs
index 08d06ad..ab9ef85 100644
--- a/compiler/specialise/SpecConstr.lhs
+++ b/compiler/specialise/SpecConstr.lhs
@@ -1439,7 +1439,7 @@ calcSpecStrictness fn qvars pats
     go_one env d   (Var v) = extendVarEnv_C both env v d
     go_one env d e 
           | isProdDmd d
-           , ds <- splitProdDmd d
+           , (_, ds) <- splitProdDmd d
            , (Var _, args) <- collectArgs e = go env ds args
     go_one env _         _ = env
 
diff --git a/compiler/stranal/DmdAnal.lhs b/compiler/stranal/DmdAnal.lhs
index 569c3ea..e6a1757 100644
--- a/compiler/stranal/DmdAnal.lhs
+++ b/compiler/stranal/DmdAnal.lhs
@@ -243,7 +243,8 @@ dmdAnal dflags _ env dmd (Case scrut case_bndr ty 
[alt@(DataAlt dc, _, _)])
        -- The insight is, of course, that a demand on y is a demand on the
        -- scrutinee, so we need to `both` it with the scrut demand
 
-       alt_dmd            = mkProdDmd [idDemandInfo b | b <- bndrs', isId b]
+       alt_dmd            = mkProdDmd One [idDemandInfo b | b <- bndrs', isId 
b]
+                             -- the scrutinee is used just once
         scrut_dmd         = alt_dmd `both`
                             idDemandInfo case_bndr'
 
@@ -561,7 +562,7 @@ dmdTransform env var dmd
            -- Invariant: res_dmd does not have call demand as its component
           arg_ds = if isPolyDmd res_dmd
                     then replicateDmd arity res_dmd
-                    else splitProdDmd res_dmd
+                    else snd $ splitProdDmd res_dmd
        in
        mkDmdType emptyDmdEnv arg_ds con_res
                -- Must remember whether it's a product, hence con_res, not 
TopRes
diff --git a/compiler/stranal/WwLib.lhs b/compiler/stranal/WwLib.lhs
index 2ed5640..34312d3 100644
--- a/compiler/stranal/WwLib.lhs
+++ b/compiler/stranal/WwLib.lhs
@@ -432,7 +432,7 @@ mkWWstr_one dflags arg
         , isProdDmd d || isPolyDmd d
        , Just (_arg_tycon, _tycon_arg_tys, data_con, inst_con_arg_tys) 
              <- deepSplitProductType_maybe (idType arg)
-        , cs <- if isProdDmd d then splitProdDmd d
+        , cs <- if isProdDmd d then snd $ splitProdDmd d
                   --  otherwise is polymorphic demand   
                 else replicateDmd (length inst_con_arg_tys) d 
        -> do uniqs <- getUniquesM



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to