Fix issue #11446. (#11455)
authorPat Gavlin <pgavlin@gmail.com>
Tue, 9 May 2017 18:10:00 +0000 (11:10 -0700)
committerGitHub <noreply@github.com>
Tue, 9 May 2017 18:10:00 +0000 (11:10 -0700)
commit4f6fe878d7dfe2a148252eecc672981eedda1f1c
treeef30162e55270ae2098a738e8586769e8c6f839f
parentce327d54bc2af18d9b470b926c6805fa4dcad2cd
Fix issue #11446. (#11455)

This issue was a GC hole that was caused by bad IR produced by
recursivelty promoting a struct with the following form:

```
struct S
{
    struct T
    {
        object o;
    };

    T t;
}
```

In this case, the recursive promotion logic created a single lclVar to
represent `S.t` and retyped it using the type of `T.o`, but did not
rewrite IR that treated the single lclVar as a struct (e.g. instances of
`lclFld/st.lclFld Vx` where `Vx` referred to the lclVar that represented
`S.t` were not rewritten an `lclVar/st.lclVar Vx`). This IR in
turn confused the incremental liveness used during code generation,
which caused the stack slot holding `o`'s value to die too early.

This change fixes codegen's incremental liveness to handle this case.
src/jit/codegenlinear.cpp
src/jit/codegenxarch.cpp