Repository : ssh://darcs.haskell.org//srv/darcs/ghc On branch : supercompiler
http://hackage.haskell.org/trac/ghc/changeset/83e1155219bbda691b6cff9ce0ab2b31eecbb614 >--------------------------------------------------------------- commit 83e1155219bbda691b6cff9ce0ab2b31eecbb614 Author: Max Bolingbroke <batterseapo...@hotmail.com> Date: Wed Mar 21 16:19:01 2012 +0000 Try to improve resid-tag tracking >--------------------------------------------------------------- .../supercompile/Supercompile/Drive/Process.hs | 70 +++++++++++--------- 1 files changed, 39 insertions(+), 31 deletions(-) diff --git a/compiler/supercompile/Supercompile/Drive/Process.hs b/compiler/supercompile/Supercompile/Drive/Process.hs index 0f89a78..177b6f2 100644 --- a/compiler/supercompile/Supercompile/Drive/Process.hs +++ b/compiler/supercompile/Supercompile/Drive/Process.hs @@ -27,7 +27,6 @@ import Supercompile.Core.FreeVars import Supercompile.Core.Renaming --import Supercompile.Core.Size import Supercompile.Core.Syntax -import Supercompile.Core.Tag (dataConTag, literalTag) import Supercompile.Drive.Split (ResidTags) @@ -204,60 +203,69 @@ showValueGroup (root, group) = go emptyVarSet noPrec root type TagAnnotations = IM.IntMap [String] --- Shows a guesstimate about what bits of original syntax residualised syntax was based on: +-- Shows a guesstimate about what bits of original syntax residualised syntax was based on. +-- For each "cost centre", shows information in this format: +-- #of bits of syntax(# of distinct tags) tagSummary :: TagAnnotations -> Int -> Int -> ResidTags -> String -tagSummary anns precision n resid_tags = unlines $ take n [intercalate "." ann ++ "\t" ++ show occs ++ "(" ++ show init_occs ++ ")" | (ann, (init_occs, occs)) <- sortBy (comparing (Down . snd . snd)) (M.toList ann_occs)] - where ann_occs = M.unionsWith (\(x1, y1) (x2, y2) -> (x1 + x2, y1 + y2)) [M.singleton (take precision ann) (1 :: Int, occs) | (tag, occs) <- IM.toList resid_tags, let Just ann = IM.lookup tag anns] - --total_occs = M.fold (+) 0 ann_occs +tagSummary anns precision n resid_tags = unlines $ take n [intercalate "." ann ++ "\t" ++ show_occs occs | (ann, occs) <- show_sorted_ann_occs] ++ ["Other:\t" ++ show_occs rest_occs] + where ann_occs = M.unionsWith plus_occs [M.singleton (take precision ann) (1 :: Int, occs) | (tag, occs) <- IM.toList resid_tags, let Just ann = IM.lookup tag anns] + plus_occs (x1, y1) (x2, y2) = (x1 + x2, y1 + y2) + show_occs (init_occs, occs) = show occs ++ "(" ++ show init_occs ++ ")" + sorted_ann_occs = sortBy (comparing (Down . snd . snd)) (M.toList ann_occs) + (show_sorted_ann_occs, rest_sorted_ann_occs) = splitAt n sorted_ann_occs + rest_occs = foldl' plus_occs (0, 0) (map snd rest_sorted_ann_occs) tagAnnotations :: State -> TagAnnotations tagAnnotations (_, Heap h _, k, qa) = IM.unions [go_term (extAnn x []) e | (x, hb) <- M.toList h, Just (_, e) <- [heapBindingTerm hb]] `IM.union` go_qa e_ann qa `IM.union` resid_tags where extAnn x ann = showSDoc (ppr x):ann + insert' ann tg tag_anns = IM.insert (tagInt tg) ann tag_anns + + insert ann tg (Nothing, tag_anns) = insert' ann tg tag_anns + insert _ tg (Just (ann), tag_anns) = insert' [ann] tg tag_anns + (e_ann, resid_tags) = trainCarFoldr (\kf (ann, resid_tags) -> second (`IM.union` resid_tags) $ go_kf ann kf) ([], IM.empty) k go_qa :: [String] -> Anned QA -> TagAnnotations - go_qa ann qa = IM.insert (tagInt (annedTag qa)) ann $ go_qa' ann (annee qa) + go_qa ann qa = insert ann (annedTag qa) $ go_qa' ann (annee qa) - go_qa' _ (Question _) = IM.empty + go_qa' _ (Question _) = (Nothing, IM.empty) go_qa' ann (Answer a) = go_answer' ann a go_term :: [String] -> AnnedTerm -> TagAnnotations - go_term ann e = IM.insert (tagInt (annedTag e)) ann $ go_term' ann (annee e) + go_term ann e = insert ann (annedTag e) $ go_term' ann (annee e) go_term' ann e = case e of - Var _ -> IM.empty + Var _ -> (Nothing, IM.empty) Value v -> go_value' ann v - TyApp e _ -> go_term ann e - CoApp e _ -> go_term ann e - App e _ -> go_term ann e - PrimOp _ _ es -> IM.unions (map (go_term ann) es) - Case e x _ alts -> go_term (extAnn x ann) e `IM.union` IM.unions [go_alt ann alt `IM.union` go_term ann e | (alt, e) <- alts] - Let x e1 e2 -> go_term (extAnn x ann) e1 `IM.union` go_term ann e2 - LetRec xes e -> IM.unions [go_term (extAnn x ann) e | (x, e) <- xes] `IM.union` go_term ann e - Cast e _ -> go_term ann e - + TyApp e _ -> (Nothing, go_term ann e) + CoApp e _ -> (Nothing, go_term ann e) + App e _ -> (Nothing, go_term ann e) + PrimOp _ _ es -> (Nothing, IM.unions (map (go_term ann) es)) + Case e x _ alts -> (Nothing, go_term (extAnn x ann) e `IM.union` IM.unions [go_term ann e | (_, e) <- alts]) + Let x e1 e2 -> (Nothing, go_term (extAnn x ann) e1 `IM.union` go_term ann e2) + LetRec xes e -> (Nothing, IM.unions [go_term (extAnn x ann) e | (x, e) <- xes] `IM.union` go_term ann e) + Cast e _ -> (Nothing, go_term ann e) + + -- NB: this is carefully set up so that we map all those tags that are likely to + -- be literalTags/dataConTags that occur multiple times in *all* tagged terms to + -- the same annotation. go_value' ann v = case v of - Indirect _ -> IM.empty - Literal _ -> IM.empty - Coercion _ -> IM.empty - TyLambda _ e -> go_term ann e - Lambda _ e -> go_term ann e - Data _ _ _ _ -> IM.empty - - go_alt :: [String] -> AltCon -> TagAnnotations - go_alt ann (DataAlt dc _ _ _) = IM.singleton (tagInt (dataConTag dc)) ann - go_alt ann (LiteralAlt l) = IM.singleton (tagInt (literalTag l)) ann - go_alt _ DefaultAlt = IM.empty + Indirect _ -> (Nothing, IM.empty) + Literal l -> (Just (show l), IM.empty) + Coercion _ -> (Nothing, IM.empty) + TyLambda _ e -> (Nothing, go_term ann e) + Lambda _ e -> (Nothing, go_term ann e) + Data dc _ _ _ -> (Just (show dc), IM.empty) go_answer :: [String] -> Anned Answer -> TagAnnotations - go_answer ann a = IM.insert (tagInt (annedTag a)) ann $ go_answer' ann (annee a) + go_answer ann a = insert ann (annedTag a) $ go_answer' ann (annee a) go_answer' ann (_, (_, v)) = go_value' ann v go_kf :: [String] -> Tagged StackFrame -> ([String], TagAnnotations) - go_kf ann kf = second (IM.insert (tagInt (tag kf)) ann) $ go_kf' ann (tagee kf) + go_kf ann kf = second (insert' ann (tag kf)) $ go_kf' ann (tagee kf) go_kf' ann kf = case kf of TyApply _ -> (ann, IM.empty) _______________________________________________ Cvs-ghc mailing list Cvs-ghc@haskell.org http://www.haskell.org/mailman/listinfo/cvs-ghc