Skip to content

R2R contains unnecessary compilations for certain generic types #120816

@tannergooding

Description

@tannergooding

As part of #120802, R2RDump over S.P.Corelib shows that there are various generic compilations for methods that "don't make sense".

For example, Vector64/128/256/512<T> are special types to the runtime and only support a finite set of primitive T (byte, sbyte, short, ushort, int, uint, long, ulong, nint, nuint, float, and double). However, we get a number of R2R methods generated for the __Canon type which will always throw:

void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, System.Span`1<__Canon>)
void System.Runtime.Intrinsics.Vector64.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector64`1<__Canon>, System.Span`1<__Canon>)

void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, System.Span`1<__Canon>)
void System.Runtime.Intrinsics.Vector128.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector128`1<__Canon>, System.Span`1<__Canon>)

void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, System.Span`1<__Canon>)
void System.Runtime.Intrinsics.Vector256.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector256`1<__Canon>, System.Span`1<__Canon>)

void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, __Canon[])
void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, __Canon[], int)
void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, System.Span`1<__Canon>)
void System.Runtime.Intrinsics.Vector512.CopyTo<__Canon>(System.Runtime.Intrinsics.Vector512`1<__Canon>, System.Span`1<__Canon>)

Ideally, we would special-case R2R to avoid generating for these types and potentially have a reusable way to annotate that other types should equally not have R2R entries generated if they will "always throw". This should save a bit of space in the output assembly.

There's potentially other fine tuning that could also be done, such as marking some of these APIs as [NonVersionable] (where there is no actual intrinsic handling in the JIT) so that they can be inlined or ensuring that specific T are pre-compiled.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions