Fix the gc layout algorithm to not double count byref #814
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This pull request is intended to fix the crossgen2 compilation crash of SlowTailCallArgs.csproj.
The compilation failure was found by @janvorli by running all the CoreCLR Pri 1 test on Linux under crossgen2 using SuperIlc.
This bug repro consistently on both debug and release compilation using
crossgen2
on Linux only.The symptom is that when we generate code that put an instance of TestByRefStruct on the stack, we hit an assertion in the code generator here:
runtime/src/coreclr/src/jit/codegenxarch.cpp
Line 8312 in d8f744d
With some digging, I figured there is a bug in the GC layout algorithm. If a struct happens to contain two instances of
ByReferenceOfT
orTypedReference
placed in the same location using ExplicitLayout, the existing code would have double-counted it.The obvious fix is to avoid double-counting, and that is what the code change does.
@dotnet/crossgen-contrib