Bug Description

If a variable which is supposed to be a structure, but might be inferred to be nil (but not actually ever nil at runtime), is declared dynamic-extent, the compiler crashes. This hugely-stripped-down example shows something a little bit silly that our code does, which perhaps it ought not, but regardless should compile.

A few things can workaround the problem for us:
- remove the inline declamation, of course getting "cannot stack allocate", but no crash; or different compiler policy around this code achieves the same thing
- remove the "WHEN" around the object constructor and refactor MUMBLE-P to test whether it should make the objects at all (because in our case HAIRYFUN needs valid objects, so it would be a bug in our code if we ever got there without - however the rest of the scaffolding provided by MY-OBJ is fairly generic and generally useful, so we can't "just" do that)
- assert essentially the same around the invocation of MY-OBJ by writing (let ((r8-a (my-obj (the (not null)

It turns out that UPDATE-UVL-LIVE-SETS is a backwards flow-sensitive analysis, propagating :UNKNOWN LVARs (unknown-values and dynamic-extent stack packets) from where they are known to be consumed back to where they are created. In Stas' reduced test case, each branch of the IF creates two dynamic-extent LVARs, one of which is shared with the other branch. The analysis starts by looking for the start of all three LVARs, each branch kills two and leaves one, and when we get to the IF we end up with the UNION of the two branches and keep propagating the two LVARs that were only killed on one branch, all the way back to the beginning. Boom.

This example is worse because of the introduction of the RETURN-FROM to force an exit after allocating the DX values but BEFORE entering their environment (which would normally cause the DX values to simply be popped off) combined with a loop to cause the backwards flow analysis to propagate the LVAR lifetimes back around through the RETURN-FROM from the other side. On the upside, if a fixed STACK phase can handle this nastier case any further bugs would have to be VERY subtle.