1.0.30.1: correct nested DX handling
* RECHECK-DYNAMIC-EXTENT-LVARS must deal with nested lvars as well:
LVAR-GOOD-FOR-DX-P may return true because a nested call is actually
good for DX, not because the lvar itself _is_ automatically DX.
So, if the compiler has rearranged things a bit, we
RECHECK-DYNAMIC-EXTENT-LVARS may believe that something is DX without
the LVAR of the actual value producer being marked as such: compiler
confusion and miscompilation follows. (And no stack-allocation
failure note even though the value is actually heap allocated.)
Fixing this is just a matter of using
HANDLE-NESTED-DYNAMIC-EXTENT-LVARS in during the rechecking as well.
* ...however, doing _that_ also makes us stack allocate values from
non-DX single-use variables substituted into DX expressions (the
"otherwise inaccessible" vs "otherwise inaccessed" distinction) --
which is not good, so disable single-use variable substitution when
the target is DX unless the source is as well. One ASSERT-NO-CONSING
test case needs to be removed because of this:
(let* ((a (list 1 2 3))
(b (the list a)))
(declare (dynamic-extent b))
...)
should not stack allocate A!
* It's not all whack-a-mole: this takes care of many previous cases
where the compiler refused to stack allocate in the presence of
non-trivial nested inline expansions, _and_ allows us the get rid of
MAYBE-PROPAGATE-DYNAMIC-EXTENT, since the recheck pass now catches
all the cases that was needed for.