@@ -9,6 +9,7 @@ module Optimize.Environment
99 , freshName
1010 , register
1111 , registerEffects
12+ , indirectly
1213 )
1314 where
1415
@@ -34,13 +35,47 @@ data Env =
3435 { _read_only_variants :: !DT.VariantDict
3536 , _read_only_home :: !ModuleName.Canonical
3637 , _uid :: !Int
37− , _deps :: Set.Set Var.Global
38+ , _deps :: Deps
3839 , _effects :: Maybe Effects.ManagerType
3940 , _has_tail_call :: !Bool
4041 }
4142
4243
4344
45+-- DEPS
46+
47+
48+data Deps
49+ = Direct { _direct :: Set.Set Var.Global, _indirect :: Set.Set Var.Global }
50+ | Indirect (Set.Set Var.Global)
51+
52+
53+emptyDeps :: Deps
54+emptyDeps =
55+ Direct Set.empty Set.empty
56+
57+
58+insertDep :: Var.Global -> Deps -> Deps
59+insertDep var deps =
60+ case deps of
61+ Direct direct indirect ->
62+ Direct (Set.insert var direct) indirect
63+
64+ Indirect indirect ->
65+ Indirect (Set.insert var indirect)
66+
67+
68+unionDeps :: Set.Set Var.Global -> Deps -> Deps
69+unionDeps vars deps =
70+ case deps of
71+ Direct direct indirect ->
72+ Direct (Set.union vars direct) indirect
73+
74+ Indirect indirect ->
75+ Indirect (Set.union vars indirect)
76+
77+
78+
4479-- OPTIMIZER
4580
4681
@@ -55,11 +90,11 @@ run
5590 -> (Text, Opt.Decl)
5691run variantDict home optimizer =
5792 let
58− ((name, def), Env _ _ _ deps fx _) =
93+ ((name, def), Env _ _ _ (Direct direct indirect) fx _) =
5994 State.runState optimizer $
60− Env variantDict home 0 Set.empty Nothing False
95+ Env variantDict home 0 emptyDeps Nothing False
6196 in
62− ( name, Opt.Decl deps fx def )
97+ ( name, Opt.Decl direct indirect fx def )
6398
6499
65100
@@ -113,7 +148,22 @@ register global =
113148
114149registerHelp :: Var.Global -> Env -> Env
115150registerHelp 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
152+
153+
154+indirectly :: Optimizer a -> Optimizer a
155+indirectly optimizer =
156+ do (Env vs home uid deps fx htc) <- State.get
157+ case deps of
158+ Indirect _ ->
159+ optimizer
160+
161+ Direct direct indirect ->
162+ do State.put (Env vs home uid (Indirect indirect) fx htc)
163+ result <- optimizer
164+ (Env vs_ home_ uid_ (Indirect indirect_) fx_ htc_) <- State.get
165+ State.put (Env vs_ home_ uid_ (Direct direct indirect_) fx_ htc_)
166+ return result
117167
118168
119169
@@ -123,7 +173,7 @@ registerHelp dep (Env vs home uid deps fx htc) =
123173registerEffects :: ModuleName.Canonical -> Effects.ManagerType -> Optimizer Effects.ManagerType
124174registerEffects home manager =
125175 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
127177 State.put (Env vs hm uid newDeps (Just manager) htc)
128178 return manager
129179