Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
adamsitnik opened this issue Aug 19, 2022 · 4 comments
Closed

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

adamsitnik opened this issue Aug 19, 2022 · 4 comments

Comments

@adamsitnik
Copy link
Member

adamsitnik commented Aug 19, 2022

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
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Aug 19, 2022
@adamsitnik adamsitnik added the x64 label Aug 19, 2022
@danmoseley
Copy link
Member

Is this relevant? #69578

@adamsitnik
Copy link
Member Author

Is this relevant? #69578

It seems that @tannergooding has hit the same or a very similar issue in the referenced PR:
#69578 (comment)

looks like ReadyToRun for Vector256.IsHardwareAccelerated is returning false for the indirect invocation

@danmoseley danmoseley added this to the 7.0.0 milestone Aug 21, 2022
@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Aug 21, 2022
@mangod9
Copy link
Member

mangod9 commented Aug 22, 2022

Hi @adamsitnik, is there a standalone repro for this, or does it occur under very specific conditions? Assume it works as expected when R2R is disabled?

@davidwrighton
Copy link
Member

Alas, this is by design. The rules for using intrinsics in CoreLib are different than in any other assembly, and extremely easy to get wrong (and extremely unforgiving to folks trying to follow good software practices and write helper functions.)

See https://github.com/dotnet/runtime/blob/d80d71fa6d805bc9129982fbfc26df951d88cce3/docs/design/coreclr/botr/vectors-and-intrinsics.md#code-review-rules-for-code-written-in-systemprivatecorelibdll

The end result is that you either need to have this function have an implementation that behaves exactly the same if the generated code think that the various hardware intrinsics are not present, or you need to disable this function from being compiled to R2R.

To do that, either mark the function with the AggressiveOptimization flag on the WidenAsciiToUtf16_Vector256 method, which will disable R2R for at least this release, or define and put a System.Runtime.BypassReadyToRunAttribute on the WidenAsciiToUtf16_Vector256 method.

@ghost ghost locked as resolved and limited conversation to collaborators Sep 22, 2022
@jeffhandley jeffhandley added arch-x64 and removed x64 labels Dec 28, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

5 participants