Skip to content

JIT: Throw statement triggers: "has ldstr VM restriction" #53726

Closed
@redknightlois

Description

@redknightlois

Description

The JIT is not able to inline this method because of the throw new FormatException("Bad variable size int"); statement with the following error:

generic !!0  (value class System.ReadOnlySpan`1<unsigned int8>,int32,int32&)
Fail Reason: has ldstr VM restriction

A cleanup version of the offending code:

        [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
        public static T ReadVariableSizeInt<T>(ReadOnlySpan<byte> buffer, int pos, out int offset) where T : unmanaged
        {
            if (typeof(T) == typeof(int) || typeof(T) == typeof(uint))
            {
                int ui = 0;

                offset = 0;

                byte b = buffer[pos + 0];
                ui |= (b & 0x7F);
                offset++;
                if ((b & 0x80) == 0)
                    goto End;

                b = buffer[pos + 1];
                ui |= (b & 0x7F) << 7;
                offset++;
                if ((b & 0x80) == 0)
                    goto End;

                b = buffer[pos + 2];
                ui |= (b & 0x7F) << 14;
                offset++;
                if ((b & 0x80) == 0)
                    goto End;

                b = buffer[pos + 3];
                ui |= (b & 0x7F) << 21;
                offset++;
                if ((b & 0x80) == 0)
                    goto End;

                b = buffer[pos + 4];
                ui |= (b & 0x7F) << 28;
                offset++;
                if ((b & 0x80) != 0)
                    throw new FormatException("Bad variable size int");

                End: return (T)(object)ui;
            }

            throw new NotSupportedException($"The type {nameof(T)} is not supported to be written.");
        }

Configuration

.Net 5.0

Analysis

It sounds to me that because the offending line is a throw statement and is to be marked as cold, that restriction should not apply.

Metadata

Metadata

Assignees

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMIquestionAnswer questions and provide assistance, not an issue with source code or documentation.tenet-performancePerformance related issue

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions