Import Upstream version 20180207
[hcoop/debian/mlton.git] / doc / guide / src / LocalRef.adoc
CommitLineData
7f918cf1
CE
1LocalRef
2========
3
4<:LocalRef:> is an optimization pass for the <:SSA:>
5<:IntermediateLanguage:>, invoked from <:SSASimplify:>.
6
7== Description ==
8
9This pass optimizes `ref` cells local to a <:SSA:> function:
10
11* global `ref`-s only used in one function are moved to the function
12
13* `ref`-s only created, read from, and written to (i.e., don't escape)
14are converted into function local variables
15
16Uses <:Multi:> and <:Restore:>.
17
18== Implementation ==
19
20* <!ViewGitFile(mlton,master,mlton/ssa/local-ref.fun)>
21
22== Details and Notes ==
23
24Moving a global `ref` requires the <:Multi:> analysis, because a
25global `ref` can only be moved into a function that is executed at
26most once.
27
28Conversion of non-escaping `ref`-s is structured in three phases:
29
30* analysis -- a variable `r = Ref_ref x` escapes if
31** `r` is used in any context besides `Ref_assign (r, _)` or `Ref_deref r`
32** all uses `r` reachable from a (direct or indirect) call to `Thread_copyCurrent` are of the same flavor (either `Ref_assign` or `Ref_deref`); this also requires the <:Multi:> analysis.
33
34* transformation
35+
36--
37** rewrites `r = Ref_ref x` to `r = x`
38** rewrites `_ = Ref_assign (r, y)` to `r = y`
39** rewrites `z = Ref_deref r` to `z = r`
40--
41+
42Note that the resulting program violates the SSA condition.
43
44* <:Restore:> -- restore the SSA condition.