Skip to content

[R2R] Debug assert failing for condition that is definitely true #74253

Closed
@adamsitnik

Description

@adamsitnik

In #73055 I've encountered a very strange bug: an assert that should definitely not be failing, was failing.

The tests were failing with Encountered infinite recursion while looking up resource 'Word_At' in System.Private.CoreLib.:

The callstack was quite long, but it showed that failure was starting from WidenAsciiToUtf16_Vector256 method:

   at System.Diagnostics.Debug.Fail(System.String, System.String)
   at System.Text.ASCIIUtility.WidenAsciiToUtf16_Vector256(Byte*, Char*, UIntPtr)
   at System.Text.ASCIIUtility.WidenAsciiToUtf16(Byte*, Char*, UIntPtr)

This method had 3 debug asserts:

private static unsafe nuint WidenAsciiToUtf16_Vector256(byte* pAsciiBuffer, char* pUtf16Buffer, nuint elementCount)
{
Debug.Assert(Vector256.IsHardwareAccelerated);
Debug.Assert(BitConverter.IsLittleEndian);
Debug.Assert(elementCount >= 2 * (uint)Vector256<byte>.Count);

And the only place where it was called from had exactly the same guards:

if (BitConverter.IsLittleEndian && Vector256.IsHardwareAccelerated && elementCount >= 2 * (uint)Vector256<byte>.Count)
{
currentOffset = WidenAsciiToUtf16_Vector256(pAsciiBuffer, pUtf16Buffer, elementCount);
}

Based on suggestions from @stephentoub I've narrowed it down to Debug.Assert(Vector256.IsHardwareAccelerated); assert and R2R (when I disable R2R, the failures are gone).

To repro the bug please checkout specific commit from my fork, as I want to remove this particular assert to make progress with the PR itself:

git clone https://github.com/adamsitnik/runtime.git --branch WidenAsciiToUtf16 repro
cd repro
git reset --hard 20a2f2313c34d2c48052336167895f66916e9cb5
.\build.cmd -c Checked -subset clr+libs+libs.tests
.\dotnet.cmd build .\src\libraries\System.Text.Encoding\tests\System.Text.Encoding.Tests.csproj /p:Configuration=Checked /t:Test

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions