@@ -8,15 +8,14 @@ import is.hail.utils.BoxedArrayBuilder
88import scala .collection .Set
99
1010object ForwardLets {
11- def apply [T <: BaseIR ](ctx : ExecuteContext )(ir0 : T ): T = {
12- val ir1 = NormalizeNames (ctx, ir0, allowFreeVariables = true )
13- val UsesAndDefs (uses, defs, _) = ComputeUsesAndDefs (ir1, errorIfFreeVariables = false )
14- val nestingDepth = NestingDepth (ir1)
15-
16- def rewrite (ir : BaseIR , env : BindingEnv [IR ]): BaseIR = {
11+ def apply [T <: BaseIR ](ctx : ExecuteContext , ir0 : T ): T =
12+ ctx.time {
13+ val ir1 = NormalizeNames (allowFreeVariables = true )(ctx, ir0)
14+ val UsesAndDefs (uses, defs, _) = ComputeUsesAndDefs (ir1, errorIfFreeVariables = false )
15+ val nestingDepth = NestingDepth (ctx, ir1)
1716
1817 def shouldForward (value : IR , refs : Set [RefEquality [BaseRef ]], base : Block , scope : Int )
19- : Boolean = {
18+ : Boolean =
2019 IsPure (value) && (
2120 value.isInstanceOf [Ref ] ||
2221 value.isInstanceOf [In ] ||
@@ -28,45 +27,44 @@ object ForwardLets {
2827 ! ContainsAgg (value)) &&
2928 ! ContainsAggIntermediate (value)
3029 )
31- }
3230
33- ir match {
34- case l : Block =>
35- val keep = new BoxedArrayBuilder [Binding ]
36- val refs = uses(l)
37- val newEnv = l.bindings.foldLeft(env) {
38- case (env, Binding (name, value, scope)) =>
39- val rewriteValue = rewrite(value, env.promoteScope(scope)).asInstanceOf [IR ]
40- if (
41- rewriteValue.typ != TVoid
42- && shouldForward(rewriteValue, refs.filter(_.t.name == name), l, scope)
43- ) {
44- env.bindInScope(name, rewriteValue, scope)
45- } else {
46- keep += Binding (name, rewriteValue, scope)
47- env
48- }
49- }
31+ def rewrite (ir : BaseIR , env : BindingEnv [IR ]): BaseIR =
32+ ir match {
33+ case l : Block =>
34+ val keep = new BoxedArrayBuilder [Binding ]
35+ val refs = uses(l)
36+ val newEnv = l.bindings.foldLeft(env) {
37+ case (env, Binding (name, value, scope)) =>
38+ val rewriteValue = rewrite(value, env.promoteScope(scope)).asInstanceOf [IR ]
39+ if (
40+ rewriteValue.typ != TVoid
41+ && shouldForward(rewriteValue, refs.filter(_.t.name == name), l, scope)
42+ ) {
43+ env.bindInScope(name, rewriteValue, scope)
44+ } else {
45+ keep += Binding (name, rewriteValue, scope)
46+ env
47+ }
48+ }
5049
51- val newBody = rewrite(l.body, newEnv).asInstanceOf [IR ]
52- if (keep.isEmpty) newBody
53- else Block (keep.result(), newBody)
50+ val newBody = rewrite(l.body, newEnv).asInstanceOf [IR ]
51+ if (keep.isEmpty) newBody
52+ else Block (keep.result(), newBody)
5453
55- case x @ Ref (name, _) =>
56- env.eval
57- .lookupOption(name)
58- .map { forwarded =>
59- if (uses.lookup(defs.lookup(x)).count(_.t.name == name) > 1 ) forwarded.deepCopy()
60- else forwarded
61- }
62- .getOrElse(x)
63- case _ =>
64- ir.mapChildrenWithIndex((ir1, i) =>
65- rewrite(ir1, env.extend(Bindings .get(ir, i).dropBindings))
66- )
67- }
68- }
54+ case x @ Ref (name, _) =>
55+ env.eval
56+ .lookupOption(name)
57+ .map { forwarded =>
58+ if (uses.lookup(defs.lookup(x)).count(_.t.name == name) > 1 ) forwarded.deepCopy()
59+ else forwarded
60+ }
61+ .getOrElse(x)
62+ case _ =>
63+ ir.mapChildrenWithIndex((ir1, i) =>
64+ rewrite(ir1, env.extend(Bindings .get(ir, i).dropBindings))
65+ )
66+ }
6967
70- rewrite(ir1, BindingEnv (Env .empty, Some (Env .empty), Some (Env .empty))).asInstanceOf [T ]
71- }
68+ rewrite(ir1, BindingEnv (Env .empty, Some (Env .empty), Some (Env .empty))).asInstanceOf [T ]
69+ }
7270}
0 commit comments