ConstThe reads that may be the one forcing binding: every read of it that no other read always precedes,
since an earlier read would already have forced it and cached the value.
Where each name is bound and read, built once and shared by every deferred expression in the graph.
Links the expression rooted at expr to the bindings it may meet when it is evaluated. Given the reads
that may force it, control flow rules out what no force can reach; without them every binding stays a
candidate.
Optionalforces: ForceSitesLinks the writes an expression performs to the uses that may observe them, for a call evaluating the
expression at a point control flow can pin down (eval). The reads are settled by the evaluating call
itself, against the environment in effect there, so only this direction is left open.
Optionalcfg: ControlFlowGraph<CfgVertex>
An expression R evaluates at a time we cannot pin down: the body a
delayedAssignbinds, forced at some later read of the name, or a promise a closure carries past the call that created it.Since the moment is open, every binding the expression may meet is a candidate, and symmetrically so: a name it reads may read any definition of that name, and a name it writes may be read by any use of it. That is the may-analysis both directions ask for, so nothing the expression really depends on, and nothing really depending on it, can be missed.