Fix issue dotnet/coreclr#11446. (dotnet/coreclr#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.
Commit migrated from https://github.com/dotnet/coreclr/commit/
4f6fe878d7dfe2a148252eecc672981eedda1f1c