1.0.30.1: correct nested DX handling
authorNikodemus Siivola <nikodemus@random-state.net>
Sat, 18 Jul 2009 16:58:37 +0000 (16:58 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sat, 18 Jul 2009 16:58:37 +0000 (16:58 +0000)
commitb3c5951a9d24468a2a471fd6769d0e6b687c08f3
treedce11d1b007710accfb58b869eb9bc76a990492f
parentc0f43bb6f83536b6177de3bae170b1fd7a760917
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.
NEWS
src/compiler/ir1opt.lisp
src/compiler/ir1util.lisp
src/compiler/locall.lisp
src/compiler/physenvanal.lisp
tests/dynamic-extent.impure.lisp
version.lisp-expr