Although I don't plan to bring over new assertions wholesale
into the current qualification branch, it's entirely possible
that various minor changes in main will use the new assertions;
having this basic support in the release branch will simplify that.
(This is why I'm adding the includes as a separate pass from
rewriting the individual assertions)
Resolves numerous regressions when enabling AddressLowering early in the
pipeline.
Previously, if a value incoming into a phi had storage which itself was
a use-projection out of some other storage, PhiStorageOptimizer bailed
out. The result was unnecessary "moves" (i.e. `copy_addr [take] [init]`
instructions).
Here, this bailout is removed. In order to do this, it is necessary to
find (1) all values whose storage recursively project out of an incoming
value (such a value may have storage which is either a use _or_ a def
projection) and (2) the block which dominates the defs of all these
values.
Together, these values are used to compute liveness to determine
interference. Previously, the live region was that between the uses of
an incoming value and its defining block. Now, it is that between the
uses of any of the values found in (1) and the dominating block found in
(2).
Merge the AddressLowering pass from its old development branch and update
it so we can begin incrementally enabling it under a flag.
This has been reimplemented for simplicity. There's no point in
looking at the old code.