@@ -9,6 +9,7 @@ module Optimize.Environment
9 , freshName
9 , freshName
10 , register
10 , register
11 , registerEffects
11 , registerEffects
@@ -34,13 +35,47 @@ data Env =
34 { _read_only_variants :: !DT.VariantDict
35 { _read_only_variants :: !DT.VariantDict
35 , _read_only_home :: !ModuleName.Canonical
36 , _read_only_home :: !ModuleName.Canonical
36 , _uid :: !Int
37 , _uid :: !Int
37− , _deps :: Set.Set Var.Global
38+ , _deps :: Deps
38 , _effects :: Maybe Effects.ManagerType
39 , _effects :: Maybe Effects.ManagerType
39 , _has_tail_call :: !Bool
40 , _has_tail_call :: !Bool
49+ = Direct { _direct :: Set.Set Var.Global, _indirect :: Set.Set Var.Global }
50+ | Indirect (Set.Set Var.Global)
55+ Direct Set.empty Set.empty
58+insertDep :: Var.Global -> Deps -> Deps
61+ Direct direct indirect ->
62+ Direct (Set.insert var direct) indirect
65+ Indirect (Set.insert var indirect)
68+unionDeps :: Set.Set Var.Global -> Deps -> Deps
71+ Direct direct indirect ->
72+ Direct (Set.union vars direct) indirect
75+ Indirect (Set.union vars indirect)
44-- OPTIMIZER
79-- OPTIMIZER
@@ -55,11 +90,11 @@ run
55 -> (Text, Opt.Decl)
90 -> (Text, Opt.Decl)
56run variantDict home optimizer =
91run variantDict home optimizer =
58− ((name, def), Env _ _ _ deps fx _) =
93+ ((name, def), Env _ _ _ (Direct direct indirect) fx _) =
59 State.runState optimizer $
94 State.runState optimizer $
60− Env variantDict home 0 Set.empty Nothing False
95+ Env variantDict home 0 emptyDeps Nothing False
62− ( name, Opt.Decl deps fx def )
97+ ( name, Opt.Decl direct indirect fx def )
@@ -113,7 +148,22 @@ register global =
114registerHelp :: Var.Global -> Env -> Env
149registerHelp :: Var.Global -> Env -> Env
115registerHelp dep (Env vs home uid deps fx htc) =
150registerHelp dep (Env vs home uid deps fx htc) =
116− Env vs home uid (Set.insert dep deps) fx htc
151+ Env vs home uid (insertDep dep deps) fx htc
154+indirectly :: Optimizer a -> Optimizer a
155+indirectly optimizer =
156+ do (Env vs home uid deps fx htc) <- State.get
161+ Direct direct indirect ->
162+ do State.put (Env vs home uid (Indirect indirect) fx htc)
164+ (Env vs_ home_ uid_ (Indirect indirect_) fx_ htc_) <- State.get
165+ State.put (Env vs_ home_ uid_ (Direct direct indirect_) fx_ htc_)
@@ -123,7 +173,7 @@ registerHelp dep (Env vs home uid deps fx htc) =
123registerEffects :: ModuleName.Canonical -> Effects.ManagerType -> Optimizer Effects.ManagerType
173registerEffects :: ModuleName.Canonical -> Effects.ManagerType -> Optimizer Effects.ManagerType
124registerEffects home manager =
174registerEffects home manager =
125 do (Env vs hm uid deps _ htc) <- State.get
175 do (Env vs hm uid deps _ htc) <- State.get
126− let newDeps = Set.union deps (getEffectDeps home manager)
176+ let newDeps = unionDeps (getEffectDeps home manager) deps
127 State.put (Env vs hm uid newDeps (Just manager) htc)
177 State.put (Env vs hm uid newDeps (Just manager) htc)
128 return manager
178 return manager