JIT: allow slightly more general promotion of structs with struct fields (#22867)
JIT: allow slightly more general promotion of structs with struct fields (#22867)

For a while now the jit has been able to promote an outer struct A with an
inner struct field B that itself has a single non-struct field C, provided
that C occupies all of B and that C and B are pointer-sized.

For example, this comes up when supporting promotion of `Span<T>`, as a span
contains a `ByReference<T>` field that itself contains a pointer-sized field.

This change relaxes the constraints slightly, allowing B and C to be less than
pointer sized, provided C still occupies all of B, and B is suitably aligned
within A.

Doing so allows promotion of the new `Range` type, which contains two `Index`
fields that each wrap an `int`. This improves performance for uses of `Range`
for simple examples like those in #22079.
wtgodbe/coreclr,poizan42/coreclr,krk/coreclr,cshung/coreclr,krk/coreclr,poizan42/coreclr,krk/coreclr,wtgodbe/coreclr,krk/coreclr,mmitche/coreclr,mmitche/coreclr,wtgodbe/coreclr,poizan42/coreclr,krk/coreclr,cshung/coreclr,wtgodbe/coreclr,cshung/coreclr,mmitche/coreclr,cshung/coreclr,krk/coreclr,cshung/coreclr,wtgodbe/coreclr,mmitche/coreclr,poizan42/coreclr,poizan42/coreclr,poizan42/coreclr,wtgodbe/coreclr,cshung/coreclr,mmitche/coreclr,mmitche/coreclr