forked from MLton/mlton
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Treat length of sequences as a "slot" in Useless optimization
In the `Value.t` representation of the Useless optimization, sequence and tuple elements are "slots", which combine a `Useful.t` lattice element with an `Exists.t` lattice element. When a value flows, vectors and tuples coerce the `Useful.t` component of slots but unify the `Exists.t` component. This ensures that agree on whether or not the element exists even if they disagree that the element is useful. If the "from"'s element is useful (and necessarily existing) but the "to"'s element is not useful, then forcing the "to"'s element to exist avoids a potentially expensive runtime coercion (e.g., to drop a component of a tuple or, worse, to drop a component of a tuple that is the contents of a vector). Previously, the length of a sequence was represented simply as a `Useful.t`; this allowed a vector (whose contents were not useful) with a useful length to flow to a vector (whose contents are necessarily not useful) with a useless length. 1aad5fe (Optimize representation of sequences in Useless pass; MLton#569) allowed the Useless optimization to change the representation of sequence with useless contents. In particular, a vector with useless contents but useless length becomes a `word64` and a vector with useless contents and useless length becomes a `unit`. However, when such vectors are themselves components of a tuple, then the program may have a flow of tuples, where the source tuple is changed from `(..., ?? vector, ...)` to `(..., word64, ...)` but the destination tuple is changed from `(..., ?? vector, ...)` to `(..., unit, ...)`. (Note that the unification of the `Exist.t` components of the corresponding tuple elements is what makes the destination tuple have a `unit` element.) This commit treats the length of arrays and vectors as a "slot", so that they track both usefulness and existence. Now, a vector with useless contents but a length that must exist becomes a `word64` (even if the length is useless) and a vector with useless contents and a length that need not exist (and is necessarily useless) becomes a `unit`. Fixes MLton#585.
- Loading branch information
1 parent
bf18753
commit 8e958ee
Showing
2 changed files
with
65 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters